1

源代码:

module main();
wire [31:0] a = 32'b0;
wire [25:0] a_man = {1'b1, a[24:0]};
initial begin
$display("%b\n%b\n%b", {1'b1,a[24:0]}, a_man[25:0], a_man);
end
endmodule

实际输出:

% iverilog dings.v && vvp a.out
10000000000000000000000000
1xxxxxxxxxxxxxxxxxxxxxxxxx
1xxxxxxxxxxxxxxxxxxxxxxxxx

我不明白为什么a_man没有分配所有位。我不明白在进行串联内联和在电汇声明中这样做之间有什么区别。

4

2 回答 2

5

根据经验,您将学会在时间 0 时不要信任任何 Verilog 模拟器。始终允许模拟器分配您的初始值的最小时间步长。

module test;
wire [7:0] a     = 7'b0;
wire [7:0] a_man = {1'b1, a[6:0]};

initial begin
  $display("%b %b %b", {1'b1,a[6:0]}, a_man[7:0], a_man);
  #1fs;
  $display("%b %b %b", {1'b1,a[6:0]}, a_man[7:0], a_man);
  #1ns;
  $display("%b %b %b", {1'b1,a[6:0]}, a_man[7:0], a_man);
end
endmodule

给出(ncsim):

1xxxxxxx xxxxxxxx xxxxxxxx
10000000 1xxxxxxx 1xxxxxxx
10000000 10000000 10000000
于 2013-01-22T15:01:25.617 回答
0

在 modelsim SE-64 10.1d 我有:

ModelSim> vsim work.main
# vsim work.main 
# ** Note: (vsim-3812) Design is being optimized...
# Loading work.main(fast)
run
# 10000000000000000000000000
# 10000000000000000000000000
# 10000000000000000000000000

正如所料...

所以:这是一个工具问题,而不是语言问题。

于 2013-01-22T14:33:18.280 回答