1

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

4

3 回答 3

3

来自 IEEE 标准 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
于 2019-06-06T00:29:16.880 回答
2

1id 一个 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 工具中的某些规则。

于 2019-06-05T13:47:25.977 回答
1

使用 curley 连接大括号

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

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

b <= a + 10'd1;
于 2019-06-05T14:30:02.647 回答