Io 具有负数和数组时在verilog中读写

Io 具有负数和数组时在verilog中读写,io,verilog,fwrite,fread,negative-number,Io,Verilog,Fwrite,Fread,Negative Number,我现在正在从txt文件读取输入数据,并将结果写入txt文件 然而,仿真结果运行良好,但未能将conv模块连接回o=a+b;系统能够读取x.txt和d.txt中的值,但无法将其链接回a和b。我的错误是什么?如何纠正 从中的相同案例中,我发现系统无法写出负十进制值,尽管它在$fwrite中更改为%d\n。有什么办法解决这个问题吗?我应该使用$dumpfile获得负数作为输出吗 这里是d.txt中的内容 56 272 1 -62 75 x.txt中的内容 562 2723 14 -620 751

我现在正在从txt文件读取输入数据,并将结果写入txt文件

然而,仿真结果运行良好,但未能将conv模块连接回o=a+b;系统能够读取x.txt和d.txt中的值,但无法将其链接回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

在for循环中添加begin并在tb中删除未打包的阵列可能会help@Emman添加begin in for loop并删除tb中的未打包数组后,tb_conv.v28上出现问题:接近$fclose:语法错误,意外的系统标识您正在使用哪个编译器?如果负数是通过上面的计算产生的,我能把3,2,1,0,-1,-2替换成“o”吗?我会这么想的。如果您的签名号码仍然存在问题,那么最好尝试创建一个最小的示例,如此检查,然后根据需要添加额外的位。NB 16位加16位给出了一个17位的结果,在某些情况下,您可能会看到下溢/上溢。我发现我的系统的加法和乘法运行良好,但当涉及负数时,结果似乎与计算不同。背后的问题是什么?溢油了吗?