我正在尝试为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
现在,这是令我不安的事情:
这里我将电线分配给balreg寄存器的不同位(黑色)。我头脑中发生了什么事(请原谅我的油漆技巧):
但由于某种原因,LSB得到它应该的,而RB和RC获得高阻抗。这是模拟结果,后面是我使用的代码(只是一个简单的测试用例)
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线,但根据模拟,它们是高阻抗。
我得到的唯一结论是,我真的不知道这些类型是什么(我迄今为止为我工作过的模型)。
非常感谢任何帮助,想法,提示。
答案 0 :(得分:2)
你只连接了dut的11个端口中的10个。你没有收到警告吗?您是按位置建立联系,而不是按名称建立联系。您已将RB
与input 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)
);