我在试着理解这个代码在合成时会产生多少翻转?
我有两个非阻塞和阻塞赋值代码的测试用例。
测试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。
我不明白这有什么不同,我只是切换了代码。
谢谢你让我知道。
发布于 2019-01-12 07:49:17
它们在功能上是不同的。非阻塞赋值先计算右侧的值,然后继续执行下一条语句,直到所有其他语句都先求值后,才会存储到左侧。阻塞语句计算右侧并立即将其存储到左侧。
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块中混合使用非阻塞语句和阻塞语句。
https://stackoverflow.com/questions/54150891
复制相似问题