Verilog 如何在延迟赋值后正确测试表达式是否匹配?

Verilog 如何在延迟赋值后正确测试表达式是否匹配?,verilog,Verilog,我有一个由头部和尾部变量控制的循环缓冲区: reg[BITS:0] head; reg[BITS:0] tail; 在某一点上有 tail <= tail+1; if (tail+1 == head) // do something end tail问题在于+1被解释为+32'sd1(一个有符号的32位数字)。您需要创建一个操作数,以便不添加额外的位 parameter [BITS:0] one = 1; 然后(tail+one)的结果保持位+1宽度 在SystemVerilog

我有一个由头部和尾部变量控制的循环缓冲区:

reg[BITS:0] head;
reg[BITS:0] tail;
在某一点上有

tail <= tail+1;
if (tail+1 == head)
  // do something
end

tail问题在于
+1
被解释为
+32'sd1
(一个有符号的32位数字)。您需要创建一个操作数,以便不添加额外的位

parameter [BITS:0] one = 1;
然后
(tail+one)
的结果保持位+1宽度


在SystemVerilog中,您可以使用简单的强制转换
位(tail+1)
或者,您可以屏蔽表达式:

parameter MASK = (1 << (BITS+1)) - 1;

// ...

if (((tail+1) & MASK) == (head & MASK))
    // do something
end

parameter MASK=(1您的代码示例中没有足够的代码进行分析。您至少需要提供always块的使用。此代码可能存在多个问题。