截断加法或减法结果的简洁方法

Clean way to truncate result of addition or subtraction

当我在 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中是无效语法。 第二种方法有效,但它太冗长和肮脏。 还有其他干净的方法吗?

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 标准确实允许自由截断或扩展操作数宽度,并且不需要警告。当然,在这种情况下,您可以忽略警告或将其关闭。我还没有看到会发出警告的模拟器。只是 linting 工具中的某些规则。

使用 curley 连接大括号

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

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

b <= a + 10'd1;

来自 IEEE 标准 1364-2001。

第 73 页: Table 29 - 由 self-determined 表达式产生的位长度:

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

第 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