Как исправить мои текущие ошибки часов / данных в MIPS 32 SCP Register File - PullRequest
0 голосов
/ 29 марта 2019

Я создаю одноцилиндровый процессор для назначения классов в Verilog, и я не могу получить правильный вывод с помощью своего тестового стенда. У меня все правильно подключено, и он производит нули для первой половины моего тестового стенда, как и должно, но как только я начинаю вводить данные, он остается на нуле. Итак, я знаю, что мой сброс и часы работают, но где-то в разделе записи я что-то пропускаю. Я мог бы использовать свежий набор глаз, и любая помощь приветствуется. ТИА.

RegisterFile.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

RegisterFile_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

1 Ответ

0 голосов
/ 30 марта 2019

Ваши часы не переключаются.На вашем испытательном стенде должно быть always #10 clk = !clk; (может потребоваться другая задержка).

Ваш оператор отображения немного странный.Попробуйте сменить его на монитор и переместить его ближе к вершине начального блока.

К вашему сведению.Ваш код не будет синтезироваться.Для меня синтезируемый регистр должен быть назначен только одним всегда блоком.У вас есть отдельные блоки для часов и сброса.Для асинхронного сброса используйте структуру ниже.Для синхронного сброса (требуется для большинства ПЛИС) затем пропустите 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
...