这是一小段 Verilog 代码。我希望它返回三个相同的结果,都是 -1 的 8 位表示。
module trivial;
reg we;
reg [7:0] c;
initial
begin
c = 8'd3;
we = 1'b1;
$display ("res(we) = %d", (we ? (-$signed(c)) / 8'sd2 : 8'd0));
$display ("res(1) = %d", (1'b1 ? (-$signed(c)) / 8'sd2 : 8'd0));
$display ("res = %d", (-$signed(c)) / 8'sd2);
end
endmodule
简而言之,我拥有的标准版本(1364-2001)在第 4.1.5 节中说除法四舍五入为零,因此 -3/2=-1。它还在第 4.5 节中说,运算符符号仅取决于操作数(编辑:但仅适用于“自我确定的表达式”;事实证明,有必要将符号标准部分与宽度部分一起阅读)。因此,带有除法的子表达式应该不受它所使用的上下文的影响,对于涉及 $signed 的子表达式也是如此。所以结果应该都是一样的吧?
三个不同的模拟器不同意我的观点。他们中只有两个彼此同意。明显的原因是使用了无符号除法而不是我期望的有符号除法。(-3=253,253/2=126.5)
有人可以告诉我是否有任何模拟器是正确的,为什么?(见下文)我显然必须遗漏一些东西,但是请问什么?非常感谢。编辑:见上文我所缺少的。我现在认为伊卡洛斯有一个错误,其他两个模拟器是对的
注意:三元选择中未使用的值似乎没有任何区别,无论是有符号还是无符号。编辑:这是不正确的,也许我在重试签名数字之前忘记保存修改后的测试
Modelsim 的 Altera 版本:
$ vsim work.trivial -do 'run -all'
Reading C:/altera/12.1/modelsim_ase/tcl/vsim/pref.tcl
# 10.1b
# vsim -do {run -all} work.trivial
# Loading work.trivial
# run -all
# res(we) = 126
# res(1) = 126
# res = -1
GPL 证书
GPLCVER_2.12a of 05/16/07 (Cygwin32).
Copyright (c) 1991-2007 Pragmatic C Software Corp.
All Rights reserved. Licensed under the GNU General Public License (GPL).
See the 'COPYING' file for details. NO WARRANTY provided.
Today is Mon Jan 21 18:49:05 2013.
Compiling source file "trivial.v"
Highest level modules:
trivial
res(we) = 126
res(1) = 126
res = -1
伊卡洛斯 Verilog 0.9.6
$ iverilog.exe trivial.v && vvp a.out
res(we) = 126
res(1) = -1
res = -1