gpt4 book ai didi

verilog - Verilog中算术运算结果的大小

转载 作者:行者123 更新时间:2023-12-02 20:48:53 28 4
gpt4 key购买 nike

我正在 Verilog 中制作一个签名比较器。这是代码:

module signedComparator(a0, a1, a2, b0, b1, b2, G, E, L);
input a0, a1, a2, b0, b1, b2;
output reg G, E, L;

always@(a0 or a1 or a2 or b0 or b1 or b2)
begin

if(a2 == 0 && b2 == 0) //both a and b >= 0
begin
L <= {a1,a0} < {b1,b0};
G <= {a1,a0} > {b1,b0};
E <= {a1,a0} == {b1,b0};
end
else if(a2 == 1 && b2 == 0) //a negative, b >= 0
begin
L <= 1;
G <= 0;
E <= 0;
end
else if(a2 == 0 && b2 == 1) //a >= 0, b negative
begin
L <= 0;
G <= 1;
E <= 0;
end
else //both a and b negative
begin
L <= (~{a1,a0} + 1) > (~{b1,b0} + 1);
G <= (~{a1,a0} + 1) < (~{b1,b0} + 1);
E <= (~{a1,a0} + 1) == (~{b1,b0} + 1);
end

end
endmodule

我想知道,向量相加时,中间结果的长度是多少?我担心最后一个案例( L <= (~{a1,a0} + 1) > (~{b1,b0} + 1); )。 ~{a1,a0}加1时,比较结果是3位长度,还是{1,1} + 1 = {0,0}?是否有文档说明 verilog 中中间结果的数据类型是什么?由于我还不知道正确的术语,因此很难搜索。

最佳答案

我假设这是为了综合,并对您的代码有一些评论。您似乎使用各个位作为模块的输入,然后使用串联来创建向量。您可以通过将端口声明为有符号向量并直接进行比较来避免这种情况。

input signed [2:0] a,b;
...
if(a == b)
...
else if(a > b)
...
else
...

此外,您还使用非阻塞赋值来建模组合逻辑。这些将在您发布的代码中工作,但实际上不应该以这种方式使用。它们通过时钟进程更好地建模同步逻辑。有一个good paper总结了一种良好的综合编码风格。

I am wondering, when adding vectors, what is the length of the intermediate result?

规范为此提供了一个表格,因为它取决于操作数和上下文。

  • 整数:无大小常量至少为 32 位
  • {a,b} : sizeof(a) + sizeof(b)
  • ~{a} : sizeof(a)
  • a + b : max(sizeof(a),sizeof(b))

因此,您的比较操作数都将(至少)为 32 位。您可以通过在值前使用勾号来显式分配常量大小。

4'b1 // 0001 Binary 1
4'd1 // 0001 Decimal 1
4'd8 // 1000 Decimal 8
1'b1 // 1 Binary 1
'b1 // The same as 1, tick here only specifies dec/oct/bin format

Is there documentation somewhere for what the data type of intermediate results in verilog will be?

到目前为止,我找到的有关此类详细信息的最佳资源是规范本身,IEEE 1364。

关于verilog - Verilog中算术运算结果的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8015709/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com