在我的输入数据类型中非法引用网络数据
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};
我是 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};