Verilog中wire与reg类型的区别

摘自另外一个同学的播客,记录自己认为的重点:

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使用在过程赋值语句中。

  • 连续赋值:等号右边操作数发生变化就需要执行(上电便一直执行),可简单的认为并列执行;
    • 在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。
  • 过程赋值:在initial块中,过程性赋值只顺序执行一次;在always块中,每一次满足always的条件,都要顺序执行一次该always块中的语句,可简单认为过程赋值是按顺序执行的;
    • 在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:
      • 如果这个条件是时钟的上升沿或下降沿,那这个硬件模型就是一个触发器;
      • 如果这个条件是某一信号的高电平或低电平,那这个硬件模型就是一个锁存器;
      • 如果这个条件是赋值语句右任意操作数的变化,那这个硬件模型就是一个组合逻辑;

7、综合结果:

  • wire型的变量综合出来一般是一根导线;
  • reg变量在always块中有两种情况:always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑 ;always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)。

8、使用:在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。

9、以下一段代码在compile阶段报错:*Error* illegal LHS in continous assignment

genvar i;

generate
   for(i=0; i

        从语法看没有任何问题。原因是rdata原来是在always中被赋值的,后来才改为assign赋值,定义没有从reg改为wire所导致(对应本文第5点)。

你可能感兴趣的:(Verilog,经验分享,其他)