在我的输入数据类型中非法引用网络数据

illegal referance to net data in my inout datatype

我是 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 

在这里,当我在数据之前使用连续赋值时,我得到一个错误,如

"LHS in procedural assignment may not be a net:data" even if I have declared it as wire. and yeah in my test bench I have declared data as reg type because when I declare it as net it shows again the "Illegal reference to net error".

很长时间以来我都无法修复它..请帮助我。

inout端口有更好的使用方式,应该和逻辑隔离,避免读写冲突,记得在使用inout端口时确保link中提到的要点是满意。

一个这样的解决方案是声明一个临时变量用于读写和 通过使用连续赋值语句为双向端口赋值。

以下代码片段会让您更加清楚如何避免错误

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}};

删除具有 data = 8'h z;else 部分,根据 LRM,单个 if 语句不能有两个 else。

输入输出端口 'data' 的类型为 wire。因此,它不能用在程序块(始终块和初始块)中 <= 表达式的左侧。

所以我们应该使用像

这样的连续赋值语句
assign data = (wr_n == 0)? mem[add]:n{1'bz};

当我们从测试台驱动输入输出端口上的任何值时,同样适用。从测试台连接到inout端口的信号必须是wire类型。因此它也应该使用连续赋值语句来编写。

assign testbench_inout_signal = (wr_n == 0)? value_to_be_written :n{1'bz};