该代码在合成时会产生多少次翻转?

时间:2019-01-11 16:54:05

标签: verilog synthesis

我试图了解该代码在合成后会产生多少次翻转?

我有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。

我不明白,只是切换代码会产生什么影响。

非常感谢让我知道。

1 个答案:

答案 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块中混合使用非阻塞和阻塞语句。