【问题标题】:illegal referance to net data in my inout datatype在我的输入数据类型中非法引用网络数据
【发布时间】:2015-08-04 13:14:13
【问题描述】:

我是 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 时,它再次显示 “非法引用网络错误”。

我很久没修好了..请帮帮我。

【问题讨论】:

    标签: verilog hdl


    【解决方案1】:

    输入端口“数据”的类型为wire。因此,它不能用在程序块(总是块和初始块)中&lt;= 表达式的左侧。

    所以我们应该使用像这样的连续赋值语句

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

    【讨论】:

      【解决方案2】:

      有一个更好的使用 inout 端口的方法,它应该与逻辑隔离以避免读写时发生冲突,请记住,每当您使用 inout 端口时,请确保满足link 中提到的几点。

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

      跟随 sn-p 将使您更清楚如何避免错误

      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。

      【讨论】:

      • 我试过了。但是我仍然在您上面建议的分配语句中得到“数据可能不是网络”。是的,我应该如何传递我想使用 temp 写入内存的数据值,因为我是从测试台输入的值。
      • 你能检查一下link-edaplayground 我试过了吗
      • 我现在可以编译它了错误再次是“非法引用网络数据”。是的,我已将其声明为 net 。
      • 如果有这只是一种关于如何使用以避免您在问题中提到的错误的方法,从您的代码我看到很多缺陷,如果可能的话,你为什么不能在我提供的链接 edaplayground 中分享 tb,我已经在 link 有一个示例 tb
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2019-06-03
      • 1970-01-01
      • 2017-12-25
      • 2019-07-03
      相关资源
      最近更新 更多