下面给出一个基于阻塞赋值和非阻塞赋值的多级触发器级联实例,要求将输
入数据延迟 3 个时钟周期再输出,并给出对应的 RTL 级结构图和仿真结果。
(1)基于 D触发器的阻塞赋值语句代码如下:
module pipeb1 (q3, d, clk);
output [7:0] q3;
input [7:0] d;
input clk;
reg [7:0] q3, q2, q1;
always @(posedge clk) begin
q1 = d;
q2 = q1;
q3 = q2;
end
endmodule
上述代码综合后能得到所期望的逻辑电路吗? 答案是否定的, 根据阻塞赋值语句的执行
过程可以得到执行后的结果是 q1 = d;q2 = d。实际只会综合出一个寄存器,如图 8-33 所示,
并列出下面的警告信息,而不是所期望的三个。其中的主要原因就是采用了阻塞赋值,首先
将 d 的值赋给 q1,再将q1 的值赋给q2,依次到q3,但是 q1、q2、q3 的值在赋值前其数值
已经全部被修改为当前时刻的 d 值,因此上述语句等效于 q3=d,这和图 8-33 所示的 RTL 结
构是一致的。
(2) 如何才能得到所需要的电路呢?如果把 always 块中的两个赋值语句的次序颠倒后