Verilog 非法引用my inout数据类型中的网络数据

Verilog 非法引用my inout数据类型中的网络数据,verilog,hdl,Verilog,Hdl,我是verilog的新手,我正在用verilog编写代码,用于创建能够读写数据的内存块。它有以下代码 我试过用一些类似问题的答案写下所有的东西,但仍然有一个错误 module memory( wr_n , rst_n ,data ,clk ,add , en); input wire wr_n; input wire rst_n; input wire clk; input wire en; parameter size = 255; para

我是verilog的新手,我正在用verilog编写代码,用于创建能够读写数据的内存块。它有以下代码

我试过用一些类似问题的答案写下所有的东西,但仍然有一个错误

module memory( wr_n , rst_n ,data ,clk ,add , en);    

input wire wr_n;    
input wire rst_n;    
input wire clk;    
input wire en;    

parameter size = 255;    
parameter n = 7;    

inout wire [n:0] data;    
input wire [n:0] add;    

reg [n:0] mem [size:0];    
integer i;    

always @( posedge clk , negedge rst_n)    
begin    
    if(!rst_n)    
    begin        
        for( i=0; i<=size; i=i+1 )    
        begin    
            mem[i] <= 8'hff;    
        end    
    end    

    else    
    begin    
        if(en)    
        begin       
            if(!wr_n)                   //read
                data <= mem[add];    
            else                        //write
                mem[add] <= data;       
        end    

        else    
             data = 8'h z;    
    end      
end
endmodule 
模块存储器(wr_n,rst_n,data,clk,add,en);
输入线wr_n;
输入线rst\u n;
输入线时钟;
输入线en;
参数大小=255;
参数n=7;
输入输出线[n:0]数据;
输入线[n:0]添加;
注册[n:0]成员[size:0];
整数i;
始终@(posedge clk,negedge rst_n)
开始
如果(!rst_n)
开始

对于(i=0;i有一种更好的使用inout端口的方法,它应该与逻辑隔离,以避免读写时发生冲突,请记住,无论何时使用inout端口,都要确保满足中提到的要点

其中一种解决方案是声明一个临时变量,用于读写和 通过使用连续赋值语句,将值分配给双向端口

下面的代码片段将让您更清楚地了解如何避免错误

reg [n:0] temp; // declare a variable and try to read and write with this variable

if(!wr_n)                   //read
  temp   <= mem[add];    
else                        //write
  mem[add] <= temp;       

  assign data = (wr_n==0)? temp : {n{1'bz}};
reg[n:0]temp;//声明一个变量并尝试使用该变量进行读写
如果(!wr_n)//读取

temp输入输出端口'data'的类型为
wire
。因此,它不能用于
的左侧。我尝试了它。但仍然得到“数据可能不是网络”在你上面建议的assign语句中。是的,我要如何传递我想用temp写入内存的数据值,因为我正在从测试台输入该值。你能检查一下我现在可以编译它吗!。谢谢。但是当我尝试为数据总线分配任何值时,我的测试台仍然会出错在初始语句下写入操作..错误再次为“非法引用网络数据”。是的,我已经声明它为net。如果它只是一种方法,说明如何使用它来避免您在问题中提到的错误,那么没有必要所有函数都基于此方法正常工作,从您的代码中我看到了很多缺陷,如果可能的话,为什么您不能在我提供的链接中共享tb,我已经知道了在
assign data = (wr_n == 0)? mem[add]:n{1'bz};
assign testbench_inout_signal = (wr_n == 0)? value_to_be_written :n{1'bz};