Лучший способ кодирования RAM в Verilog

Какой код лучше писать в ОЗУ?

  1. присвоение data_out внутри always блока:

    module memory(
        output reg [7:0] data_out,
        input [7:0] address,
        input [7:0] data_in, 
        input write_enable,
        input clk
    );
        reg [7:0] memory [0:255];
    
        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
            data_out <= memory[address];
        end
    
    endmodule
    
  2. присвоение data_out с помощью оператора assign:

    module memory(
        output [7:0] data_out,
        input [7:0] address,
        input [7:0] data_in, 
        input write_enable,
        input clk
    );
        reg [7:0] memory [0:255];
    
        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
        end
    
        assign data_out = memory[address];
    
    endmodule
    

Какие-нибудь рекомендации?


person e19293001    schedule 03.10.2011    source источник


Ответы (4)


Это зависит от ваших требований.

  1. Это регистрирует ваш вывод в память. Если вы синтезируете это с воротами, у вас будет на 16 триггеров больше, чем в случае 2. Это означает, что вы используете немного больше площади. Это также означает, что ваш вывод будет иметь меньшую задержку распространения относительно часов, чем в случае 2. Кроме того, выходные данные не будут доступны до следующего тактового цикла.

  2. Ваши выходные данные будут доступны в том же тактовом цикле, в котором они были записаны, хотя и с большей задержкой распространения по сравнению с часами.

Вам нужно решить, что использовать, исходя из ваших требований.

Третий вариант - использовать сгенерированную оперативную память, что является жестким макросом. Это должно иметь преимущества по площади, мощности и, возможно, по времени по сравнению с вариантами 1 и 2.

person toolic    schedule 03.10.2011

Чтобы добавить к ответу инструментария - если вы используете метод асинхронного чтения (случай 2), он не будет отображаться на блок RAM в FPGA, поскольку блоки RAM во всех основных архитектурах, о которых я знаю, имеют синхронное чтение.

person Martin Thompson    schedule 05.10.2011

Обе формы действительны, в зависимости от желаемого типа конвейерной обработки. Я всегда рекомендую следовать рекомендациям по кодированию RAM Xilinx - это хороший способ убедиться, что код синтезируется в правильные конструкции FGPA.

Например, ваш пример 1 будет синтезироваться в Xilinx BRAM (то есть в выделенный блочный RAM), поскольку это синхронное чтение, а ваш пример 2 будет синтезироваться в Xilinx Distributed Ram (поскольку это асинхронное чтение).

См. Рекомендации по кодированию в документе Xilinx UG901 (Руководство пользователя Vivado Design Suite) в разделе «Методы кодирования RAM HDL». Он также хорошо описывает разницу между синхронным чтением и асинхронным чтением для RAM.

person John Wallner    schedule 21.12.2016

Во второй программе будет ошибка компиляции, поскольку мы не можем «присвоить» значение «Reg». Будет выдана ошибка: "Регистрация недопустима в левой части непрерывного присвоения".

person Anurag    schedule 29.09.2014