• reg 类型的变量,是用来保存值的,只有等到下一次再执行赋值语句的时候,reg保存的值才会发生改变,reg类型的值发生改变常伴随着触发条件,比如说always中的@条件满足,则执行一次赋值语句,使reg变量值改变。其余情况,不会发生改变,相当于锁存器
  • wire类型的变量,综合出来就是一条导线,导线一端给什么,它就出什么,因此是输出是随着输入连续变化的

  • 模块的输入端口所连外部信号可以是reg类型或者wire类型,输入端口本身只能是wire类型,输出端口本身可以是reg或者wire类型,端口所连外部信号必须是wire

  • assign语句代表连续赋值语句,只要左边操作数发生变化,立马执行这个语句,因此是连续变化的,存不住值,所以assign的左值必须是wire

  • always@语句代表过程赋值语句,因为always语句被执行是需要满足触发条件的,所以always过程块里面的内容不是每时每刻都被执行,因此需要将被赋值的对象定义成reg类型,以便这个值能被保持住。

  • reg变量在always中有两种情况:

    ​ (1)always @(a or b or c)形式的,即不带时钟边沿的,综合出来还是组合逻辑;

    ​ (2)always @(posedge clk)形式的,即带有边沿的,综合出来一般是时序逻辑

  • 过程赋值又分为 阻塞赋值 “=” 和 非阻塞赋值 “<=” 两种。这里的非阻塞赋值符号 “<=” 与 “小于等于” 符号相同,他们在不同的语境下表示不同含义,要注意区分,例如在“if-else”等判断语句中,一般都表示为“小于等于”。

  • ① 阻塞赋值 “=“ 。 阻塞赋值和我们平时理解的赋值差不多,不用太多解释,就是按照语句的顺序,一句句往下顺序执行。一个赋值语句执行完,然后执行下一个赋值语句。

    ② 非阻塞赋值 “<=” 。非阻塞赋值就比较特别了,在同一个always过程块中,非阻塞赋值语句都是同时并发执行的,并且在过程块结束时才执行赋值操作。也就是说,在同一个always过程块中,非阻塞赋值语句被执行没有先后顺序,在过程快结束时,大家一起被赋值。

  • 总结:

    什么时候用reg

    1.该变量需要保值,不能连续变化

    2.该变量在电路中综合成触发器,输出端本身则为reg,还有锁存器,输出端本身也是reg(靠想象)

    3.需要用在always中赋值

    什么时候用wire

    1.元件输入端口只能为wire,例化时,输出端口所连接的信号必须是wire

    2.该变量在综合成电路时是一条导线

    3.需要用到assign的地方

    4.不要看到一根导线就以为是wire类型,它也可以指触发器的输出端本身

    阻塞赋值和非阻塞赋值

    1.均写在always中

    2.阻塞赋值 “=“,就是按照语句的顺序,一句句往下顺序执行。一个赋值语句执行完,然后执行下一个赋值语句

    3.非阻塞赋值 “<=”,在同一个always过程块中,非阻塞赋值语句被执行没有先后顺序,在过程快结束时,大家一起被赋值。

    4.组合电路用阻塞,时序电路用非阻塞