截断加法或减法结果的干净方法

时间:2019-06-05 07:37:44

标签: verilog system-verilog

当我在Verilog中执行加法或减法运算时,某些编译器会发出警告。

// code example
logic [9 : 0] a, b, c;
always_ff @(posedge clk) begin
  b <= a + 1;
  c <= a - 1;
end
// warning example
Warning (13469): Verilog HDL assignment warning at xxx.sv(xxx): truncated value with size 11 to match size of target (10) File: xxx.sv Line: xxx
Warning (13469): Verilog HDL assignment warning at xxx.sv(xxx): truncated value with size 32 to match size of target (10) File: xxx.sv Line: xxx

我想找到清除这些警告的干净方法。我尝试了两种方法:

// method 1
b <= (a + 1)[9 : 0];
// method 2
logic [10 : 0] d;
d <= a + 1;
b <= d[9 : 0];

我认为第一种方法可以编译,但是在verilog中它是无效的语法。 第二种方法可行,但是太冗长又肮脏。 还有其他干净的方法吗?

3 个答案:

答案 0 :(得分:2)

1 id为32位值。结果,表达式的宽度为32。 解决方法是使用大小值“ 1”,即

b <= a + 1'b1;
c <= b - 1'b1;

这可能会给您11位结果。进位位将丢失。此时,您可以执行其他一些技巧。我猜这是最常见的一种。使用进位位。

logic con;
logic[9:0] a,b;
...
{con, a} <= b + 1'b1;

可以像示例中那样使用临时变量。

通常,verilog标准确实允许自由截断或扩展操作数宽度,并且不需要警告。当然,在这种情况下,您可以忽略警告或将其关闭。我还没有看到会警告它的模拟器。整理工具中的某些规则。

答案 1 :(得分:2)

使用柯利色系括号

b <= {a + 1}[9 : 0];

或更改常量大小(默认为32位)

b <= a + 10'd1;

答案 2 :(得分:2)

摘自IEEE Std 1364-2001。

第73页: 表29-自定义表达式产生的位长度:

  • 未定大小的常数=与整数相同

第45页:

  • 注意实现可能会限制整数变量的最大大小,但至少应为32位。

因此,您看到的警告来自尝试使用大小为变量(10位)的一个无大小的数字常量(至少32位),因此合成器警告结果可能溢出。

因此,只需确保所有操作数的大小都相同:

代替:

// code example
logic [9 : 0] a, b, c;
always_ff @(posedge clk) begin
  b <= a + 1;
  c <= a - 1;
end

要做:

// code example
logic [9 : 0] a, b, c;
always_ff @(posedge clk) begin
  b <= a + 10'd1;
  c <= a - 10'd1;
end