为什么在访问的2个内存块之间有延迟?

问题描述 投票:0回答:1

我正在为Elleptic Curve Crypto系统构建Modulo减少模块。我想访问Ram,以便在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]的数据。你能帮我吗。我不在乎。

memory verilog
1个回答
0
投票

当你有2个这样的锁存器时:

always @(posedge clk)
    a <= b;

always @(posedge clk)
    b <= c;

在构成之后a的结果将是b的旧值。所以,如果b是1而c是2,则在posedge

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

如果你需要保证a获得b的新价值,你有几个选择:

1)使用组合过程计算b

  always @(*)
     b = c;

2)在clk的negedge处分配b

  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在negedge可以工作。您必须了解“memread”的评估方式。

© www.soinside.com 2019 - 2024. All rights reserved.