为什么此 Verilog 线路中的位分配为 'z'?

Why are the bits in this Verilog wire assigned as 'z'?

我正在尝试在 Verilog 中为 ALU 项目创建一个乘法模块。 当我将测试值传递给此模块 0100101010011100 和 0100110000000000 并使用 $display() 打印这些值时,它们看起来很正常。但是,如果我尝试打印我的计算值之一,如 p0-p15,它会显示 16 位的 z。我不明白为什么会这样,因为看起来我正在分配 {16{inputA[0]}} & inputB[15:0] 当我打印出来时显示有效结果。

我能得出的唯一结论是,我要么不正确地调用了这个模块,要么不正确地分配了值。

我应该为 15 个 'p' 变量使用 reg 而不是 wires 吗?

module Product(inputA, inputB, Output);
    input [15:0] inputA, inputB;
    output [31:0] Output;

//calculate 16 subproducts
wire [15:0] p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15;
//assign p0[15:0]  = {16{inputA[0]}} & inputB[15:0];
assign p0[15:0]  = {16{inputA[0]}} & inputB[15:0];
assign p1[15:0]  = {16{inputA[1]}} & inputB[15:0];
assign p2[15:0]  = {16{inputA[2]}} & inputB[15:0];
assign p3[15:0]  = {16{inputA[3]}} & inputB[15:0];
assign p4[15:0]  = {16{inputA[4]}} & inputB[15:0];
assign p5[15:0]  = {16{inputA[5]}} & inputB[15:0];
assign p6[15:0]  = {16{inputA[6]}} & inputB[15:0];
assign p7[15:0]  = {16{inputA[7]}} & inputB[15:0];
assign p8[15:0]  = {16{inputA[8]}} & inputB[15:0];
assign p9[15:0]  = {16{inputA[9]}} & inputB[15:0];
assign p10[15:0] = {16{inputA[10]}} & inputB[15:0];
assign p11[15:0] = {16{inputA[11]}} & inputB[15:0];
assign p12[15:0] = {16{inputA[12]}} & inputB[15:0];
assign p13[15:0] = {16{inputA[13]}} & inputB[15:0];
assign p14[15:0] = {16{inputA[14]}} & inputB[15:0];
assign p15[15:0] = {16{inputA[15]}} & inputB[15:0];

initial begin
    $display("%b",inputA);
    $display("%b",inputB);
    $display("----------------");
    $display("%b", {16{inputA[0]}} & inputB[15:0]);
    $display("%b", {16{inputA[1]}} & inputB[15:0]);
    $display("%b", {16{inputA[2]}} & inputB[15:0]);
    $display("%b", {16{inputA[3]}} & inputB[15:0]);
    $display("%b", {16{inputA[4]}} & inputB[15:0]);
    $display("%b", {16{inputA[5]}} & inputB[15:0]);
    $display("%b", {16{inputA[6]}} & inputB[15:0]);
    $display("%b", {16{inputA[7]}} & inputB[15:0]);
    $display("%b", {16{inputA[8]}} & inputB[15:0]);
    $display("%b", {16{inputA[9]}} & inputB[15:0]);
    $display("%b", {16{inputA[10]}} & inputB[15:0]);
    $display("%b", {16{inputA[11]}} & inputB[15:0]);
    $display("%b", {16{inputA[12]}} & inputB[15:0]);
    $display("%b", {16{inputA[13]}} & inputB[15:0]);
    $display("%b", {16{inputA[14]}} & inputB[15:0]);
    $display("%b", {16{inputA[15]}} & inputB[15:0]);
    $display("----------------");
    $display("%b",p0);
    $display("%b",p1);
    $display("%b",p2);
    $display("%b",p3);
    $display("%b",p4);
    $display("%b",p5);
    $display("%b",p6);
    $display("%b",p7);
    $display("%b",p8);
    $display("%b",p9);
    $display("%b",p10);
    $display("%b",p11);
    $display("%b",p12);
    $display("%b",p13);
    $display("%b",p14);
    $display("%b",p15);
    $display("----------------");
end


wire [31:0] s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15;
assign s0[31:0]  = p0  << 0;
assign s1[31:0]  = p1  << 1;
assign s2[31:0]  = p2  << 2;
assign s3[31:0]  = p3  << 3;
assign s4[31:0]  = p4  << 4;
assign s5[31:0]  = p5  << 5;
assign s6[31:0]  = p6  << 6;
assign s7[31:0]  = p7  << 7;
assign s8[31:0]  = p8  << 8;
assign s9[31:0]  = p9  << 9;
assign s10[31:0] = p10 << 10;
assign s11[31:0] = p11 << 11;
assign s12[31:0] = p12 << 12;
assign s13[31:0] = p13 << 13;
assign s14[31:0] = p14 << 14;
assign s15[31:0] = p15 << 15;
end module

    module testbench();

 
  reg [4:0] i;
  parameter n=16;
  reg [15:0] inputA;
  reg [15:0] inputB;
  reg [4:0] opcode;
 
  
 
  wire  [31:0] out1; 
  wire [1:0] out2; 
  
  
  wire [15:0] a,b;
  assign a =16'b0100_1010_1001_1100;
  assign b =16'b0100_1100_0000_0000;
  
  
  Product prod(a, b, out1);
endmodule

这是时间 0 竞争条件,因为您没有为输入传播到输出提供足够的时间。其他模拟器显示非 z 结果。您可以在显示任何信号之前添加#1。

一般来说,模拟需要时间来传播同时发生的所有语句。