Я создаю процессор с одним циклом для задания класса в Verilog и, похоже, не могу получить правильный результат на своем тестовом стенде. У меня все подключено правильно, и он выдает нули для первой половины моего тестового стенда, как и должно быть, но как только я начинаю вводить данные, они остаются на нуле. Итак, я знаю, что мой сброс и часы работают, но где-то в разделе записи я что-то упустил. Мне не помешал бы свежий взгляд, и любая помощь приветствуется. ТИА.
Файл регистрации.v:
module registerfile(read1, read2, writeto, writedat, writeenable, out1, out2, clock, reset);
input [4:0] read1;
input [4:0] read2;
input [4:0] writeto;
input [31:0] writedat;
input writeenable, clock, reset;
output [31:0] out1, out2;
// 32 bit registers x 32
reg [31:0] RF[31:0];
reg [31:0] out1;
reg [31:0] out2;
integer i;
always @(posedge reset)
begin
for (i = 0; i < 32; i++)
RF[i] <= 0;
out1 <= 32'h00000000;
out2 <= 32'h00000000;
end
always @(posedge clock)
begin
if (writeenable)
RF[writeto] <= writedat;
out1 <= RF[read1];
out2 <= RF[read2];
end
endmodule
Регистрационный файл_tb.v:
module registerfile_tb ();
reg [4:0] read1;
reg [4:0] read2;
wire [31:0] out1;
wire [31:0] out2;
reg [4:0] writeto;
reg [31:0] writedat;
reg writeenable;
reg clock;
reg reset;
registerfile DUT(read1, read2, writeto, writedat, writeenable, out1, out2, clock, reset);
initial
begin
clock <= 1;
reset <= 1;
#21 reset <= 0;
#100;
read1 <= 5'b0;
read2 <= 5'b0;
writeto <= 5'b00101;
writedat <= 32'd0;
writeenable <= 1;
#100;
#21 read1 <= 5'b11010;
#21 read2 <= 5'b00101;
#21 read1 <= 5'b00001;
#21 writedat <= 32'd1; //
#21 read2 <= 5'b11111;
#21 read1 <= 5'b01010;
#21 read2 <= 5'b01110;
end
always @(read1 or read2)
#21 $display("| read1 = %d | read2 = %d | out1 = %d | out2 = %d |", read1, read2, out1, out2);
endmodule





Ваши часы не переключаются. В вашем тестовом стенде должен быть always #10 clk = !clk; (вы можете захотеть другую задержку).
Ваш оператор display немного странный. Подумайте о том, чтобы заменить его на монитор и переместить ближе к верхней части исходного блока.
к вашему сведению. Ваш код не будет синтезирован. Для меня синтезируемый регистр должен быть назначен только одним всегда блоком. У вас есть отдельные блоки для часов и сброса. Для асинхронного сброса используйте структуру ниже. Для синхронного сброса (требуется для большинства FPGA) опустите or posedge reset
always @(posedge clock or posedge reset)
begin
if (reset) begin
for (i = 0; i < 32; i++)
RF[i] <= 0;
out1 <= 32'h00000000;
out2 <= 32'h00000000;
end
else begin
if (writeenable)
RF[writeto] <= writedat;
out1 <= RF[read1];
out2 <= RF[read2];
end
end