使用verilog中的内存执行写和读操作?

使用verilog中的内存执行写和读操作?,verilog,Verilog,无法从内存中读取 在这里,我首先对内存执行写操作,然后在执行读操作之后,我使用temp1存储内存中的读取值,但我遇到了无法从内存读取的错误 我希望在内存中执行读取操作后从temp1输出 module memory(clk,m_add,ead,ewr,mrd,temp1); input clk; input [7:0]m_add; input [7:0]ead; input ewr,mrd; output [7:0]temp1; reg [

无法从内存中读取

在这里,我首先对内存执行写操作,然后在执行读操作之后,我使用temp1存储内存中的读取值,但我遇到了无法从内存读取的错误

我希望在内存中执行读取操作后从temp1输出

  module memory(clk,m_add,ead,ewr,mrd,temp1);

    input clk;
    input [7:0]m_add;
    input [7:0]ead;
    input ewr,mrd;

    output [7:0]temp1;

    reg [7:0] memr [0:255];
    reg [7:0]temp;

    always @(posedge clk)
    begin
      if(ewr==1)
      begin
        memr[ead] <= 8'b00001111;
      end 
      else if(mrd==1) 
      begin
        temp <= memr[m_add];
      end
    end

    assign temp1=temp;

  endmodule

  module tb();

    reg clk,mrd,ewr;
    reg [7:0]m_add;
    reg [7:0]ead;

    wire [7:0]temp1;

    memory m1(clk,m_add,ead,ewr,mrd,temp1);

    initial begin
      clk=0;
      #5 ewr=1;
      #5 ead=8'b00000001;
      #10 mrd=1;
      m_add=8'b00000001;

      #40 $stop;
    end

    always #5 clk=~clk;

  endmodule

我希望在您的测试台上从temp1输出,您永远不会使ewr信号为0。因此,您永远不会在模块中传递语句ifewr==1。您可以将测试台的初始块重写为:

initial begin
    clk=0;
    #10 ewr=1; ead=8'b00000001;    // write operation
    #10 ewr=0;                     // bring ewr to 0
    #10 mrd=1; m_add=8'b00000001;  // read operation
    #10 mrd=0;                     // bring mrd to 0

    #40 $stop;
 end

您可以将此字符串添加到tb模块:initial$monitortemp1;