我目前正在使用 Verilog 为流水线处理器创建一个控制单元。我正在使用电线进行组合分配。由于我仅支持有限的指令,因此我决定仅使用有限的位来分配控制信号。
以下是主控单元代码:
module mcu(
input [5:0] Opcode,
output ALUSrc,
output [1:0] ALUop,
output RegDst,
output MemWrite,
output MemRead,
output MemtoReg,
output RegWrite
);
assign ALUSrc = (Opcode[0]);
assign ALUop[0] = (!Opcode[0]);
assign ALUop[1] = (!Opcode[5]);
assign RegDst = (!Opcode[0]);
assign MemWrite = (Opcode[3]);
assign MemRead = (!Opcode[3]);
assign MemtoReg = (!(Opcode[0]^Opcode[1]));
assign RegWrite = (Opcode[5]^Opcode[3]);
endmodule
然而,
ALUSrc
和RegDst
尽管是互补的,但产生相同的值。
提前感谢您的回答。
我尝试同时使用两者!和〜,除此之外我不知道如何解决。我也尝试过更改索引,但无济于事。
问题不在发布的代码中。
这个小TB。
module tb ();
reg [5:0] Opcode;
reg ALUSrc;
reg [1:0] ALUop;
reg RegDst;
reg MemWrite;
reg MemRead;
reg MemtoReg;
reg RegWrite;
integer i;
mcu dut(
.Opcode(Opcode),
.ALUSrc(ALUSrc),
.ALUop(ALUop),
.RegDst(RegDst),
.MemWrite(MemWrite),
.MemRead(MemRead),
.MemtoReg(MemtoReg),
.RegWrite(RegWrite)
);
initial begin
$monitor("Opcode = %h, ALUSrc = %h RegDst = %h ",Opcode,ALUSrc,RegDst);
for(i = 0; i < 4;i++)begin
Opcode = i;
#1;
end
end
endmodule
产品
xcelium> run
Opcode = 00, ALUSrc = 0 RegDst = 1
Opcode = 01, ALUSrc = 1 RegDst = 0
Opcode = 02, ALUSrc = 0 RegDst = 1
Opcode = 03, ALUSrc = 1 RegDst = 0