摘自另外一个同学的播客,记录自己认为的重点:
0、wire、reg都可以有四种取值:0、1、z、x;为了表示这四种取值,所以验证平台中引入可以表示四值的logic类型;
1、wire型数据常用来表示以assign关键字指定的组合逻辑信号,模块的输入输出端口类型都默认为wire型,默认初始值是z。
2、reg型表示的寄存器类型。always模块内被赋值的信号,必须定义为reg型,代表触发器。默认初始值是x。
3、reg相当于存储单元,wire相当于物理连线。
4、两者的区别是:寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动;wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。
5、wire只能被assign连续赋值,reg只能在initial和always中赋值。
6、wire使用在连续赋值语句中,而reg使用在过程赋值语句中。
7、综合结果:
8、使用:在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。
9、以下一段代码在compile阶段报错:*Error* illegal LHS in continous assignment
genvar i;
generate
for(i=0; i<step; i=i+1) begin:fiford
assign rdata[i] = mem[raddr+i];
end
endgenerate
从语法看没有任何问题。原因是rdata原来是在always中被赋值的,后来才改为assign赋值,定义没有从reg改为wire所导致(对应本文第5点)。