Verilog中算术运算结果的大小

时间:2011-11-04 21:05:23

标签: verilog

我正在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中的中间结果的数据类型是什么?这很难搜索,因为我还不知道正确的术语。

1 个答案:

答案 0 :(得分:5)

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

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

此外,您正在使用非阻塞分配来模拟组合逻辑。这些将在您发布的代码中起作用,但实际上不应该以这种方式使用。它们通过定时过程更好地建模同步逻辑。有good paper总结了合成的良好编码风格。

  

我想知道,在添加向量时,中间结果的长度是多少?

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

  • 整数:未经过大小写的常量至少为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
  

是否存在适用于数据类型的文档   verilog的中间结果会是什么?

到目前为止,我发现的最好的资源就是规范本身IEEE 1364。