реализация памяти, счетчика программ и сумматора в Verilog. Смущен относительно моего вывода - PullRequest
0 голосов
/ 06 марта 2020

Я должен спроектировать сумматор, программный счетчик, память, часы и модуль тестового стенда.

Я предполагаю инициализировать из тестового стенда каждый адрес памяти с 0, а затем загрузить файл .hex, который У меня есть, который находится в том же каталоге, что и моя программа, в памяти. Текстовый файл выглядит так:

"... ...

20042000

000d2820

0c000013

... .. .... "

У меня просто проблемы с загрузкой файла text.hex в память. Вот мой код:

module testbench; //create the testbench 

    instruction_memory memory();


    integer i;


    initial begin
    for(i=0; i<2048; i = i+1) begin
    memory.mem[i] = 0;
                              end
    end

        initial begin
        $writememh("text.hex",memory.mem);
        end

    integer m;

        initial begin
        for(m=0; m<2048; m = m+1) begin
        $display(memory.mem[m]);
        $display(m);
                                  end
        end





endmodule //end the testbench

module instruction_memory(); // creating the module that 
                            //simulates the instruction //memory
    reg[31:0]mem[0:2047];


endmodule //ending the instruction memory module

module clock(); //starting the clock module

endmodule //ending the clock module

module pc(); //starting the program counter module

endmodule // ending the program counter module

module adder();

endmodule // ending the adder module

Когда я запускаю его, мой вывод выглядит так:

0

1

0

2

0

3

...

...

0 2047

Почему он возвращает 0 вместо «000d2820» или какое-то другое слово?

Итак, я выполнил одно задание ... Я инициализировал память с 0, но не могу прочитать файл в нее. Как мне это сделать?

изменить: это мой код сейчас:

module testbench; //create the testbench 

    instruction_memory memory();


    integer i;
        initial begin
        for(i=0; i<2048; i = i+1) begin
        memory.mem[i] = 0;
                                  end
        end


    initial begin
    #100;
    end


    integer n;

        initial begin
        for(n=0; n<2048; n = n+1) begin
        $display(memory.mem[n]);
        $display(n);
                                  end
        end


    initial begin
    #100;
    end


    initial begin
        $readmemh("C:\\Users\\19724\\Desktop\\spring2020\\DL\\programs\\program3\\text.hex",memory.mem);
    end 

    initial begin
    #100;
    end

    integer m;

        initial begin
        for(m=0; m<2048; m = m+1) begin
        $display(memory.mem[m]);
        $display(m);
                                  end
        end





endmodule //end the testbench

module instruction_memory(); // creating                                                            //the module that 
                            //simulates the instruction //memory

    reg[31:0]mem[0:2047];


endmodule //ending the instruction memory module

Этот код повторяет тот же вывод, что и выше ^ ..

0

1

0

2

..

..

0

2047

, за исключением двух раз, теперь у меня есть два цикла, отображающие выходное значение после инициализации до нуля и после "чтения шестнадцатеричного файла", я поместил это в кавычки, потому что по какой-то причине он не работает, даже если я написал абсолютное значение путь .. Кто-нибудь знает, почему он не читает мой шестнадцатеричный файл?

Ответы [ 2 ]

1 голос
/ 06 марта 2020

так как же я не позволяю им работать параллельно?
Как инициализировать память инструкций нулями, а затем инициализировать каждый адрес, для которого у меня есть значение, из моего файла text.hex, не делая это параллельно?
И что ты имеешь в виду, я очищаю память, ты имеешь в виду, когда я инициализирую память нулями?
Что касается «чтения файла в него», я думал, что это то, что я делать с "writememh (" text.hex ", memory.mem)"

Все становится намного проще, если вы используете один инициал. Я часто делю разделы, помещая между ними задержку, которая:

  1. Облегчает видеть в моей симуляции, что происходит.

  2. Уверен что код действительно выполняется последовательно.

Пример:

...
initial
begin
   for(i=0; i<2048; i = i+1) begin
      memory.mem[i] = 0;

   #1000;

   $readmemh("text.hex",memory.mem);

   #1000;
   for(m=0; m<2048; m = m+1)
     $display(memory.mem[m]);

  $display(m);
end
....

Проверьте свой журнал моделирования, чтобы увидеть, дает ли $ readmemh сообщение об ошибке, поскольку симуляторам часто требуется специальный путь для поиска файла.

1 голос
/ 06 марта 2020

Следующая строка создает выходной файл с именем text.hex:

    $writememh("text.hex",memory.mem);

. Для чтения из входного файла необходимо использовать $readmemh:

    $readmemh("text.hex", memory.mem);

См. свободный стандарт IEEE 1800-2012, раздел 21.4 Загрузка данных массива памяти из файла .

Кроме того, как указано в комментариях, ваш 1-й блок initial назначает 0 для каждой памяти расположение. 2-й initial блок, использующий $readmemh, конфликтует с 1-м. Я думаю, что вам просто нужно сохранить второй блок.

...