我在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
Run Code Online (Sandbox Code Playgroud)
我想知道,在添加向量时,中间结果的长度是多少?我担心最后一个案例(L <= (~{a1,a0} + 1) > (~{b1,b0} + 1);).当向〜{a1,a0}加1时,结果的长度为3比特,或者{1,1} + 1 = {0,0}?是否存在某些文档,以确定verilog中的中间结果的数据类型是什么?这很难搜索,因为我还不知道正确的术语.
小智 5
我假设这是为了综合,并对你的代码有一些评论.您似乎使用单个位作为模块的输入,然后使用串联来生成向量.您可以通过将端口声明为带符号向量并直接进行比较来避免这种情况.
input signed [2:0] a,b;
...
if(a == b)
...
else if(a > b)
...
else
...
Run Code Online (Sandbox Code Playgroud)
此外,您使用非阻塞分配来模拟组合逻辑.这些将在您发布的代码中起作用,但实际上不应该以这种方式使用.它们通过定时过程更好地建模同步逻辑.有一篇很好的论文总结了合成的良好编码风格.
我想知道,在添加向量时,中间结果的长度是多少?
规范有一个表格,因为它取决于操作数和上下文.
因此,您的比较操作数将(至少)为32位.您可以通过在值之前使用tick来显式指定常量.
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
Run Code Online (Sandbox Code Playgroud)
是否存在某些文档,以确定verilog中的中间结果的数据类型是什么?
到目前为止,我发现的最好的资源就是规范本身IEEE 1364.