我是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时,它再次显示了 “非法提及网络错误”。
我很长时间没能解决它..请帮助我。
答案 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语句不能有其他两个。