verilog编写时注意的问题

1.assign 和 always@(*)两者描述组合逻辑时

    assign out_a = a;

    always@(*)

        begin

            out_b = b;

        end

    所综合出的电路是相同的,都是对输出进行连续赋值。只有当always的敏感列表中是边沿触发的时候,综合出来的电路才是触发器类型。

2.wire型和reg类型的区别

(1)在使用assign语句时,需要将寄存器类型的值引出,需要使用wire类型,充当导线使用。

例如:

wire out;

assign out = a&b;

(2):元件实例化时必须用wire型
         例如:
          wire   dout;
         ram   u_ram
       (
        ....
       .out(dout);
       )

     reg变量在always中有两种情况:
         (1)always @(a or b or c)形式的,即不带时钟边沿的,综合出来还是组合逻辑;

         (2)always @(posedge clk)形式的,即带有边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)

    reg和wire的区别:

     reg型数据保持最后一次的赋值,而wire型数据需要持续的驱动。wire用在连续赋值语句assign中;reg用于always过程赋值语句中。
    在连续赋值语句assign中,表达式右侧的计算结果可以立即更新到表达式的左侧,可以理解为逻辑之后直接连接了一条线,这个逻辑对应于表达式的右侧,这条线对应于wire;
     在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,这个变量可以声明成reg型,根据触发条件的不同,过程语句可以建模不同的硬件结构:
    (1)如果这个条件是时钟上升沿或下降沿,那硬件模型就是一个触发器,只有是指定了always@(posedge or negedge)才是触发器。
    (2)如果这个条件是某一信号的高低电平,那这个硬件模型就是一个锁存器。
    (3)如果这个条件是赋值语句右侧任意操作数的变化,那这个硬件模型就是一个组合逻辑。

3.Verilog中同步复位和异步复位比较

4.verilog中阻塞赋值和非阻塞赋值的区别

    

猜你喜欢

转载自blog.csdn.net/weixin_37603007/article/details/79707767