非法依赖我的inout数据类型中的净数据

时间:2015-07-30 12:07:04

标签: 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;    
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可能不是网络:数据”   即使我已将其声明为电线。   是的,在我的测试台上,我已经将数据声明为reg类型,因为当我将其声明为net时,它再次显示了   “非法提及网络错误”。

我很长时间没能解决它..请帮助我。

2 个答案:

答案 0 :(得分:1)

inout port&#39;数据&#39;属于wire类型。因此,它不能在程序块中的<=表达式的左侧使用(始终是块和初始块)。

所以我们应该使用像

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

当我们在测试台上的inout端口上驱动任何值时,情况也是如此。从测试台连接到输入端口的信号必须是导线类型。因此,它也应该使用连续赋值语句编写。

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

答案 1 :(得分:0)

有一种更好的方法可以使用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}};

删除具有else的{​​{1}}部分,根据LRM,单个if语句不能有其他两个。