不理解Verilog中的类型

时间:2014-02-07 02:41:01

标签: simulation verilog

我正在尝试为8位乘法器制作一个块,并且测试平台给我的结果基本上说我不知道​​我在做什么用我的电线和寄存器。为了更容易回答,我将显示我的代码,然后我认为重要的部分:

module multiplier_result(
    input ADD_cmd,
    input LOAD_cmd,
    input SHIFT_cmd,
    input reset,
    input [7:0] B_in,
     input [7:0] Add_out,
     input cout,
    output wire [7:0] RB,
    output wire [15:0] RC,
     output wire [8:0] temp_reg, 
    output wire LSB
    );

wire [8:0] from_mux;
reg[16:0] balreg; 
reg tempadd;



//assign the outputs. all combinational
assign RB = balreg[15:8];
assign RC = balreg[15:0];
assign LSB = balreg[0];
assign temp_reg = balreg[16:8];

mux_9 mux(
            .sel(~ADD_cmd),
            .Add_out(Add_out), 
            .cout(cout),
            .mux_out(from_mux),
            .temp_reg(temp_reg)
            );

always @ (*) begin
    if(reset) begin
        balreg[16:0] = 17'd0;
        tempadd = 1'b0;
    end

    else
    begin
        if(LOAD_cmd) 
        begin
            balreg[16:8] = 9'b000000000;
            balreg[7:0] = B_in;
        end 

        if(SHIFT_cmd)
        begin
            balreg[16:8] = from_mux;
            balreg = balreg >> 1;
        end

    end
end

endmodule

现在,这是令我不安的事情:

enter image description here

这里我将电线分配给balreg寄存器的不同位(黑色)。我头脑中发生了什么事(请原谅我的油漆技巧):

enter image description here

但由于某种原因,LSB得到它应该的,而RB和RC获得高阻抗。这是模拟结果,后面是我使用的代码(只是一个简单的测试用例)

enter image description here

module multiplier_result_tb(
    );

reg ADD_cmd;
reg LOAD_cmd;
reg SHIFT_cmd;
reg reset;
reg [7:0] B_in;
reg [8:0] Add_out;
wire [7:0] RB;
wire [15:0] RC;
wire [8:0] temp_reg; //size 9
wire LSB;

multiplier_result dut(ADD_cmd,LOAD_cmd,SHIFT_cmd,reset,B_in,Add_out,RB,RC,temp_reg,LSB);

initial begin
LOAD_cmd = 0;
#10;
LOAD_cmd = 1;
reset = 0;
B_in = 8'b00001010;
Add_out = 9'd0;
ADD_cmd = 0;
SHIFT_cmd = 0;
end
endmodule

我根本没有关注这些结果。 balreg寄存器都已设置好,因此必须定义RB和RC线,但根据模拟,它们是高阻抗。

我得到的唯一结论是,我真的不知道这些类型是什么(我迄今为止为我工作过的模型)。

非常感谢任何帮助,想法,提示。

1 个答案:

答案 0 :(得分:2)

你只连接了dut的11个端口中的10个。你没有收到警告吗?您是按位置建立联系,而不是按名称建立联系。您已将RBinput cout相关联。您需要在测试平台中驾驶cout

另一种建立联系的方式是名称。这更详细,但它可以使您的代码更清晰:

multiplier_result dut (
        // Inputs:
    .ADD_cmd    (ADD_cmd),
    .Add_out    (Add_out),
    .B_in       (B_in),
    .LOAD_cmd   (LOAD_cmd),
    .SHIFT_cmd  (SHIFT_cmd),
    .cout       (cout),
    .reset      (reset),
        // Outputs:
    .LSB        (LSB),
    .RB         (RB),
    .RC         (RC),
    .temp_reg   (temp_reg)
);