В настоящее время я создаю блок управления конвейерным процессором с использованием 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
дают одно и то же значение, несмотря на то, что они дополняют друг друга.
Вот результаты тестового стенда для образца теста.
Заранее спасибо за любые ответы.
Я пробовал использовать оба! и ~, кроме этого я понятия не имею, как это исправить. Я тоже пробовал менять индексацию, но безрезультатно.
Нет, это все они. Я так понимаю, это как-то связано с моим синтаксисом? Но ради Бога я не могу найти ничего плохого.
Думаю, ты мог бы попробовать ^
,
Это для двух операторов xor. Если вы говорите о замене, то компилятор просто выдаст ошибку.
Я не знаю Verilog из норы в земле, но я нашел документ о синтаксисе/операторе с примерами его использования в качестве унарного оператора.
Хорошо, я попробую!
Извините, это был мой первый вопрос, в следующий раз опубликую MRE!
Проблема дизайна, о которой говорится в тексте сообщения, отсутствует в опубликованном коде.
Вот простой tb, который управляет последовательностью 32'b0, 1, 2, 3 в коде операции.
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
// FOR EDA PLAYGROUND $dumpfile("dump.vcd"); $dumpvars;
$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
и эти волны
используя опубликованный код в качестве DUT.
Код ведет себя так, как ожидалось, что-то еще не так.
Спасибо за ответ. Это была проблема с общей интеграцией модуля. Мне следовало добавить больше контекста. Тем не менее спасибо за ответ.
Это единственная дополнительная пара, которая неверна?