Как сделать вывод о блокировке ОЗУ в Verilog

У меня есть одна очень специфическая проблема с проектом, который преследует меня уже несколько дней. У меня есть следующий код Verilog для модуля RAM:

module RAM_param(clk, addr, read_write, clear, data_in, data_out);
    parameter n = 4;
    parameter w = 8;

    input clk, read_write, clear;
    input [n-1:0] addr;
    input [w-1:0] data_in;
    output reg [w-1:0] data_out;

    reg [w-1:0] reg_array [2**n-1:0];

    integer i;
    initial begin
        for( i = 0; i < 2**n; i = i + 1 ) begin
            reg_array[i] <= 0;
        end
    end

    always @(negedge(clk)) begin
        if( read_write == 1 )
            reg_array[addr] <= data_in;
        if( clear == 1 ) begin
            for( i = 0; i < 2**n; i = i + 1 ) begin
                reg_array[i] <= 0;
            end
        end
        data_out = reg_array[addr];
    end
endmodule

Он ведет себя именно так, как ожидалось, однако, когда я иду синтезировать, я получаю следующее:

Synthesizing Unit <RAM_param_1>.
    Related source file is "C:\Users\stevendesu\---\RAM_param.v".
        n = 11
        w = 16
    Found 32768-bit register for signal <n2059[32767:0]>.
    Found 16-bit 2048-to-1 multiplexer for signal <data_out> created at line 19.
    Summary:
    inferred 32768 D-type flip-flop(s).
    inferred 2049 Multiplexer(s).
Unit <RAM_param_1> synthesized.

32768 вьетнамок! Почему он просто не делает вывод о блочной ОЗУ? Этот модуль ОЗУ настолько огромен (а у меня их два - один для памяти инструкций, один для памяти данных), что он занимает всю доступную область ПЛИС ... раз в 2,4 раза.

Я пробовал все, чтобы заставить его выводить блочную RAM вместо 33k триггеров, но, если я не смогу это выяснить в ближайшее время, мне, возможно, придется значительно уменьшить размер моей памяти, чтобы она поместилась на чипе.


person stevendesu    schedule 18.12.2013    source источник
comment
Просматривали ли вы таблицы данных для своей FPGA, чтобы узнать, какие модули памяти она предлагает? Вероятно, есть также заметки по применению о выводе RAM от вашего поставщика FPGA. Я думаю, что большинство баранов, вероятно, не имеют «четкой» функции, которая стирает весь баран, так что, возможно, вы могли бы попробовать удалить это.   -  person Tim    schedule 18.12.2013
comment
Синтезатор не может сделать вывод о структуре, которая физически не существует на вашей FPGA, а разные FPGA имеют разную RAM. Это не проблема Verilog, вам нужно прочитать руководства для вашей FPGA.   -  person    schedule 18.12.2013
comment
Извините, я обновляю новый ответ, это BRAM, а не распределенная RAM. Мне очень жаль.   -  person Khanh N. Dang    schedule 20.12.2013


Ответы (1)


Я просто удаляю что-то из вашего кода, результат такой:

 module RAM_param(clk, addr, read_write, clear, data_in, data_out);
parameter n = 4;
parameter w = 8;

input clk, read_write, clear;
input [n-1:0] addr;
input [w-1:0] data_in;
output reg [w-1:0] data_out;

// Start module here!
reg [w-1:0] reg_array [2**n-1:0];

integer i;
initial begin
    for( i = 0; i < 2**n; i = i + 1 ) begin
        reg_array[i] <= 0;
    end
end

always @(negedge(clk)) begin
    if( read_write == 1 )
        reg_array[addr] <= data_in;
    //if( clear == 1 ) begin
        //for( i = 0; i < 2**n; i = i + 1 ) begin
            //reg_array[i] <= 0;
        //end
    //end
    data_out = reg_array[addr];
end
endmodule  

Инициализация всех нулей может не нуждаться в коде, если вы хотите инициализировать, просто сделайте это:

initial
begin
    $readmemb("data.dat", mem);
end

Затем результат, который я получил от ISE 13.1

Synthesizing (advanced) Unit <RAM_param>.
INFO:Xst:3231 - The small RAM <Mram_reg_array> will be implemented on LUTs in order to maximize performance and save block RAM resources. If you want to force its implementation on block, use option/constraint ram_style.

    -----------------------------------------------------------------------
    | ram_type           | Distributed                         |          |
    -----------------------------------------------------------------------
    | Port A                                                              |
    |     aspect ratio   | 16-word x 8-bit                     |          |
    |     clkA           | connected to signal <clk>           | fall     |
    |     weA            | connected to signal <read_write>    | high     |
    |     addrA          | connected to signal <addr>          |          |
    |     diA            | connected to signal <data_in>       |          |
    |     doA            | connected to internal node          |         

Обновите здесь! Большое спасибо mcleod_ideafix. Извините, что забыл ваш вопрос: это блочная ОЗУ, а не распределенная. Для блочного ОЗУ вы должны принудительно: Синтез - XST -> Свойства процесса -> Параметр HDL -> Стиль ОЗУ -> Изменить с автоматического на Блочный. Результат будет такой:

Synthesizing (advanced) Unit <RAM_param>.
INFO:Xst:3226 - The RAM <Mram_reg_array> will be implemented as a BLOCK RAM, absorbing the following register(s): <data_out>
    -----------------------------------------------------------------------
    | ram_type           | Block                               |          |
    -----------------------------------------------------------------------
    | Port A                                                              |
    |     aspect ratio   | 16-word x 8-bit                     |          |
    |     mode           | read-first                          |          |
    |     clkA           | connected to signal <clk>           | fall     |
    |     weA            | connected to signal <read_write>    | high     |
    |     addrA          | connected to signal <addr>          |          |
    |     diA            | connected to signal <data_in>       |          |
    |     doA            | connected to signal <data_out>      |          |
    -----------------------------------------------------------------------
    | optimization       | speed                               |          |
    -----------------------------------------------------------------------
Unit <RAM_param> synthesized (advanced).

Конец обновления

Я рекомендую вам прочитать руководство пользователя xst, чтобы найти образец кода RAM и техническое описание устройства. Например, в некоторой RAM LUT FPGA: сигнал сброса не действителен. Если вы пытались сбросить его, необходимо интегрировать дополнительный логический модуль для сброса. Это приводит к D-FF вместо RAM. Сигнал сброса будет автоматически назначен на сброс системы.

В случае блочной RAM (не LUT RAM) я предпочитаю конкретную глубину / ширину данных или генерацию ядра или вызываю ее прямо из библиотеки. Дополнительный исходный код для общего использования (ASIC / FPGA) можно найти здесь: http://asic-world.com/examples/verilog/ram_dp_sr_sw.html

person Khanh N. Dang    schedule 18.12.2013
comment
Я просто хотел указать, что вы заменили аппаратный сброс загрузкой оперативной памяти во время выполнения. Я думаю, что это именно то, что нужно сделать, поскольку обычная оперативная память обычно не допускает асинхронного сброса всех ячеек, а блоки initial, как правило, не могут быть синтезированы. - person ; 18.12.2013
comment
Это все исправило! На самом деле бит очистки был чем-то в примере кода нашего профессора. Я должен сообщить ему, что это все сломало. - person stevendesu; 18.12.2013
comment
Если есть четкое, обычно это реализуется как if (clear==1'b1) begin ... end else if (read_write==1'b1) begin ... end else begin ... end. Кроме того, negedge(clk) обычно записывается как negedge clk - person Greg; 18.12.2013
comment
@JoeHass: Я знаю, что начальное значение невозможно синтезировать, но начальное значение с нулем - это не вопрос больше в дизайне RAM, это просто для инициализации ROM. Я просто хочу сделать его короче: D. Пытаюсь дать сброс, но он не синтезировался как RAM (просто массив FF). Насколько я понимаю, RAM использует системный сброс, а не определяемый пользователем, потому что нам не нужно очищать RAM во время работы. Если система это сделает, я определю это как регистры. - person Khanh N. Dang; 19.12.2013
comment
Ваш результат от ISE показывает, что использовалась распределенная RAM, а не блочная RAM! - person mcleod_ideafix; 20.12.2013
comment
@mcleod_ideafix: Спасибо за ваш комментарий, я его совсем забыл. Я обновил свой ответ сейчас !. - person Khanh N. Dang; 20.12.2013