具有负数和数组时在verilog中读写
read and write in verilog when having negative numbers and array
我现在正在从 txt 文件读取输入数据并将结果写入 txt 文件。
然而,结果在模拟中运行良好,但无法 link 返回 conv 模块,即 o = a+b;系统能够读取 x.txt 和 d.txt 中的值,但不能 link 返回 a 和 b。我的错误是什么以及如何纠正?
从我的相同案例中,我发现系统无法写出负十进制值,尽管它在 $fwrite 中被更改为“%d\n”。有什么方法可以解决吗?我应该使用 $dumpfile 得到负数作为输出吗?
这是d.txt
中的内容
56
272
1
-62
75
x.txt
中的内容
562
2723
14
-620
751
这是我的模块代码:
module conv (input signed[15:0]a,b,
output signed[15:0] o);
assign o = a + b;
endmodule
我的测试平台代码:
module conv_tb();
reg clk;
reg signed [15:0]a[4:0];
reg signed [15:0]b[4:0];
wire signed [15:0]o[4:0];
integer ai,bi,oo,i;
conv U1(.a(a),.b(b),.o(o));
initial begin
clk <= 1'b0;
forever
#1 clk = ~clk;
end
initial begin
ai = $fopen("x.txt","r");
bi = $fopen("d.txt","r");
oo = $fopen("o.txt","w");
#1;
for (i = 0; i<5; i=i+1)
a <= $fscanf(ai,"%d\n",x);
b <= $fscanf(bi,"%d\n",d);
#4;
$fwrite(oo,"%d\n",o);
end
$fclose(ai);
$fclose(bi);
$fclose(oo);
$finish;
end
endmodule
另一种解决问题的方法是使用如图所示的十六进制值输入,明确要求将所有负值转换为文本文件中相应的十六进制值
module conv ( input signed [15:0] a, b,
output signed [15:0] o);
assign o = a + b;
endmodule
module conv_tb();
reg signed [15:0] a,b,o;
conv u0(.a(a),.b(b),.o(o));
reg [15:0] Mem [0:4];
reg [15:0] Mem1 [0:4];
integer j,k,oo;
initial
begin
$readmemh("x.txt",Mem);
$readmemh("d.txt",Mem1);
oo = $fopen("o.txt","w");
end
initial begin
for (k=0; k<5; k=k+1) begin a= Mem[k]; end
for (j=0; j<5; j=j+1) begin b= Mem1[j]; $fwrite(oo,"%d\n",o); end
end
endmodule
使用 fwrite 将有符号数写入文本文件的示例:
module write_signed;
integer out_file;
initial begin
out_file = $fopen("out_file.txt","w");
$fwrite(out_file, "%d\n", 3);
$fwrite(out_file, "%d\n", 2);
$fwrite(out_file, "%d\n", 1);
$fwrite(out_file, "%d\n", 0);
$fwrite(out_file, "%d\n", -1);
$fwrite(out_file, "%d\n", -2);
$fclose(out_file);
end
endmodule
生成:
3
2
1
0
-1
-2
我现在正在从 txt 文件读取输入数据并将结果写入 txt 文件。
然而,结果在模拟中运行良好,但无法 link 返回 conv 模块,即 o = a+b;系统能够读取 x.txt 和 d.txt 中的值,但不能 link 返回 a 和 b。我的错误是什么以及如何纠正?
从我的相同案例中,我发现系统无法写出负十进制值,尽管它在 $fwrite 中被更改为“%d\n”。有什么方法可以解决吗?我应该使用 $dumpfile 得到负数作为输出吗?
这是d.txt
中的内容56
272
1
-62
75
x.txt
中的内容562
2723
14
-620
751
这是我的模块代码:
module conv (input signed[15:0]a,b,
output signed[15:0] o);
assign o = a + b;
endmodule
我的测试平台代码:
module conv_tb();
reg clk;
reg signed [15:0]a[4:0];
reg signed [15:0]b[4:0];
wire signed [15:0]o[4:0];
integer ai,bi,oo,i;
conv U1(.a(a),.b(b),.o(o));
initial begin
clk <= 1'b0;
forever
#1 clk = ~clk;
end
initial begin
ai = $fopen("x.txt","r");
bi = $fopen("d.txt","r");
oo = $fopen("o.txt","w");
#1;
for (i = 0; i<5; i=i+1)
a <= $fscanf(ai,"%d\n",x);
b <= $fscanf(bi,"%d\n",d);
#4;
$fwrite(oo,"%d\n",o);
end
$fclose(ai);
$fclose(bi);
$fclose(oo);
$finish;
end
endmodule
另一种解决问题的方法是使用如图所示的十六进制值输入,明确要求将所有负值转换为文本文件中相应的十六进制值
module conv ( input signed [15:0] a, b,
output signed [15:0] o);
assign o = a + b;
endmodule
module conv_tb();
reg signed [15:0] a,b,o;
conv u0(.a(a),.b(b),.o(o));
reg [15:0] Mem [0:4];
reg [15:0] Mem1 [0:4];
integer j,k,oo;
initial
begin
$readmemh("x.txt",Mem);
$readmemh("d.txt",Mem1);
oo = $fopen("o.txt","w");
end
initial begin
for (k=0; k<5; k=k+1) begin a= Mem[k]; end
for (j=0; j<5; j=j+1) begin b= Mem1[j]; $fwrite(oo,"%d\n",o); end
end
endmodule
使用 fwrite 将有符号数写入文本文件的示例:
module write_signed;
integer out_file;
initial begin
out_file = $fopen("out_file.txt","w");
$fwrite(out_file, "%d\n", 3);
$fwrite(out_file, "%d\n", 2);
$fwrite(out_file, "%d\n", 1);
$fwrite(out_file, "%d\n", 0);
$fwrite(out_file, "%d\n", -1);
$fwrite(out_file, "%d\n", -2);
$fclose(out_file);
end
endmodule
生成:
3
2
1
0
-1
-2