Использование неблокирующего назначения в Verilog - PullRequest
0 голосов
/ 08 июня 2018

Допустимо ли использование неблокирующего присваивания в следующем примере (в state == 2'b01)?Это хорошо имитирует, но как это будет синтезировать?

module test(input wire [7:0]a, input wire clk, output reg [11:0] b);
reg [1:0] state;
reg [7:0] mem [0:4095]
integer i;
always @(posedge clk) begin
    if(state == 2'b00) begin
        //some logic
    end
    else if(state == 2'b01)
        state <= 2'10;
        for(i = addr; i < addr + 64; i = i+1)
            if(a == mem[i]) begin
                state <= 2'b00;
                //some logic
            end
        end
    end
    else begin
        //some logic
    end
end
endmodule

Ответы [ 2 ]

0 голосов
/ 08 июня 2018
  1. Неблокирующее присвоение (<=) является подходящим способом моделирования последовательной логики.

  2. Код, который вы показали, означает: Если состояниев настоящее время 01, тогда, если любая из 64 ячеек памяти, начиная с addr, равна a, тогда следующее состояние будет 00, в противном случае оно будет 10.

    Если это то, что вы хотите, код правильный.

0 голосов
/ 08 июня 2018

Вы пользуетесь неблокирующими данными в порядке, но вы одновременно читаете 64 значения памяти .

См. Мой ответ Здесь о HDL и циклах и о том, что происходит с циклами при синтезе.


Если у вас нет памяти с 64 портами, вы не можетесделай это.Ваш инструмент может создать его, но он, вероятно, будет использовать регистры 32768, а не память.Если инструмент очень, очень умный, он может разделить ваш дизайн на 64 ячейки памяти, каждая из которых содержит 64 записи.

Если вам нужна эта функциональность, я бы сам разбил память на 64 блока и прочитал все 64 вв то же время.

Кстати: если вы строите кеш, это не способ сделать это.У вас обычно была бы память TAG.

...