Почему между двумя блоками памяти есть доступ? - PullRequest
0 голосов
/ 16 апреля 2019

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

    module memtest3(
    input memread,
    input memwrite,
    input [3:0] addr0,
    input [3:0] addr1,
    input clk,load0,load1,
    input [31:0] write_data1,
    input [31:0] write_data0,
    output reg [31:0] read_data1,
    output reg [31:0] read_data0);
    reg [3:0] addr [1:0];
    reg [31:0] memo [10:0]; 
    //----------------<Memory module>-----------------//
    integer i,j;
    initial begin
       for(i=0;i<11;i=i+1)begin
        memo[i]<=i;
       end
    end
    always @(posedge clk)begin
        if(memwrite==1'b1)begin
            memo[addr[0]]<=write_data0;
            memo[addr[1]]<=write_data1;
        end
        else if(memread==1'b1) begin
            read_data0<=memo[addr[0]];
            read_data1<=memo[addr[1]];
        end     
    end
  //----------------<Memory Addressing>----------------//
    always @(posedge clk)begin
    /*if(memread==1'b1)begin
            if(i<<5)begin
                addr[0]<=i;
                addr[1]<=i+1;
           i<=i+2;
             end
        end*/
       if(memread==1'b1)begin
            if(i<<4)begin
               if(load0==1'b1)begin
                    addr[0]<=i;
                    addr[1]<=i+1;
               end
               else if(load1==1'b1)begin
                    addr[0]<=i;
                    addr[1]<=i+1;
               end
               i<=i+2;
             end
         end
      end

      endmodule

, если я изменяю i на i + 7, тогда чтение данных addr [0] занимает больше времени.Можете ли вы помочь мне.Я не в курсе.

1 Ответ

0 голосов
/ 16 апреля 2019

Если у вас есть 2 защелки, как это:

always @(posedge clk)
    a <= b;

always @(posedge clk)
    b <= c;

результатом a после установки будет старое значение b.Итак, если b было 1, а c было 2, то в позиции

a --> 1 (old b)
b --> 2 (old c)

, если вам нужно гарантировать, что a получит новое значение b, у вас есть пара вариантов:

1) вычислить b с помощью комбинационного процесса:

  always @(*)
     b = c;

2) назначить b при необходимости clk

  always @(negedge clk)
      b <= c;

3) вы можете убедиться, чточто ваш b имеет значение, которое вам нужно на конкретном такте, оценивая его на текущем этапе, что-то вроде следующего.

always @(posedge clk) begin
     a <= b;
     next_b <= c;
end

always @*
   b = next_b;

Существуют и другие способы, которые могут ограничивать переменные.Например, если b - это просто временная переменная, используемая внутри логики флопа, вы можете использовать блокирующие назначения для ее оценки.Но не используйте его где-либо еще:

 always @(posedge clk) begin
    b = c;  // b only used inside this block and uses BA
    a <= b;
 end

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

...