Я работаю над школьным проектом для двухступенчатого конвейерного процессора в Verilog HDL и столкнулся с проблемой, которая поставила меня в тупик на несколько дней.Я добавлю небольшие фрагменты кода и картинку сигналов, которые я получаю через ModelSim через мое описание.Я просто беру вывод из моего ALU:
ALU #(BUS_WIDTH(BUS_WIDTH)) alu (
.A(Amux),
.B(Bmux),
.sel(ALUsel),
.Dout(ALUout)
);
Затем я передаю его непосредственно в буфер между моими каскадами в одном и том же файле следующим образом (другие сигналы и данные, которые буферизируются, удаляются для простотычтение):
Buffer #(.BUS_WIDTH(BUS_WIDTH)) buff(
.clk(clk),
.reset(reset),
.aluA(ALUout),
.aluB(ALUoutM),
);
Внутренняя часть модуля буфера выглядит следующим образом (я снова удаляю все остальное, буферизуемое для удобства чтения:
module Buffer(
input clk,
input reset,
input [31:0] aluA,
output reg [31:0] aluB
);
always @(posedge clk)
begin
if (~reset)
begin
aluB <= 32'h00000000;
end else
begin
aluB <= aluA;
end
end
endmodule
Следующее изображение - это то, чтоУ меня проблемы с:
Это происходит через несколько циклов после запуска испытательного стенда и успешного запуска предыдущих циклов. Глядя на изображение, верхний сигналALUout и второй сигнал - ALUoutM. Мой желаемый результат - чтобы мой сигнал ALUoutM соответствовал моему сигналу ALUout из предыдущего тактового цикла (я убедился, что полный тактовый цикл - это период между изменениями сигнала на изображении).этот желаемый результат виден во всех циклах, предшествующих этому. Между первым и вторым циклами,результат не такой, как хотелось бы, но затем возвращается к правильности.Я трижды проверил и убедился, что мой ALUoutM не управляется никакими другими сигналами.Я в основном пытаюсь выяснить, делаю ли я ошибку новичка с verilog, о которой я не знаю.Спасибо за любую помощь.
ДОПОЛНЕНИЕ
Согласно комментариям Олдфарта (мне нравится это имя), я смог добавить сигналы буфера и в мой симулятор, но он отображаетточно такое же поведение, как и входные сигналы.На следующем изображении вы заметите правильное поведение для первых 4 тактов, а затем из буфера появится случайное значение 0x00000000.Тогда это правильно для еще одного тактового цикла перед тем, как полностью улететь с рельсов.