我试图了解该代码在合成后会产生多少次翻转?
我有2个具有非阻塞和阻塞分配代码的测试用例。
测试1。
wire aclk;
wire [1:0] a;
reg [1:0] c;
reg [1:0] b;
always @(posedge aclk)
begin
b <= a + 1;
c = b;
end
测试2。
wire aclk;
wire [1:0] a;
reg [1:0] c;
reg [1:0] b;
always @(posedge aclk)
begin
b = a + 1;
c <= b;
end
测试1有4个FF,而测试2有2个FF。
我不明白,只是切换代码会产生什么影响。
非常感谢让我知道。
答案 0 :(得分:5)
它们在功能上有所不同。非阻塞分配先评估右侧,然后继续下一条语句,直到首先评估所有其他语句,才将存储到左侧。阻塞语句会评估右侧,并立即将其存储到左侧。
Test1 is doing this:
evaluate (a+1)
store b into c , BEFORE (a+1) is stored into b!!!
store (a+1) into b
Test2 is doing this:
evaluate (a+1)
store (a+1) into b
store b into c
就像提到toolic一样,您通常在顺序逻辑中使用非阻塞语句。多数人还建议不要在同一begin-end块中混合使用非阻塞和阻塞语句。