截断加法或减法结果的简洁方法
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
当我在 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