微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > Verilog中$fwrite总是在仿真成功后出错,请各位帮帮忙啊?

Verilog中$fwrite总是在仿真成功后出错,请各位帮帮忙啊?

时间:10-02 整理:3721RD 点击:


我是用QUARTUS调用Modelsim进行RTL级仿真,在Run all成功之后,才出现以上错误的。请大家帮忙看看到底是哪儿的问题
我在测试文件中用的$fwrite,这是我的测试程序:


  1. `timescale 1us/100ps
  2. module deqpsk_top_tf;
  3. reg rst;
  4. reg sys_clk;
  5. reg [11:0]din;
  6. //reg Hide_out;
  7. reg [11:0] v[0:250000];//读1000个应该就够了
  8. parameter [31:0]FCW_50K=858993400;//从250KHz分频得到50K分频控制字
  9. parameter [33:0]frequency=1717986918;//从250KHz分频得到100K分频控制字
  10. parameter newf_we=1'b1;
  11. wire signed[13:0]datai;
  12. wire signed[13:0]dataq;
  13. wire [27:0]df;
  14. //wire [33:0]frequency;
  15. //reg newf_we;
  16. wire [11:0]fsin_o;
  17. wire [11:0]fcos_o;
  18. wire signed[13:0]result1;
  19. wire signed[13:0]result2;
  20. wire signed[13:0]chouqu_out1;
  21. wire signed[13:0]chouqu_out2;
  22. wire signed[13:0]i_lpf;
  23. wire signed[13:0]q_lpf;
  24. integer vline;
  25. //integer i;
  26. deqpsk_top deqpsk_top(
  27.        .rst(rst),
  28.        .sys_clk(sys_clk),
  29.        .din(din),
  30.        .datai(datai),
  31.        .dataq(dataq),
  32.        .df(df),
  33.        .frequency(frequency),
  34.        .newf_we(newf_we),
  35.        .fsin_o(fsin_o),
  36.        .fcos_o(fcos_o),
  37.        .result1(result1),
  38.        .result2(result2),
  39.        .chouqu_out1(chouqu_out1),
  40.        .chouqu_out2(chouqu_out2),
  41.        .FCW_50K(FCW_50K),
  42.        .i_lpf(i_lpf),
  43.        .q_lpf(q_lpf)
  44.        );
  45.       
  46. always #2 sys_clk
  47. initial
  48. begin
  49. $readmemb("D:/FPGA relatation/Quartus codes/QPSK_SYS_top/QPSK_OUT2.txt",v);
  50. end
  51. integer file1;
  52. integer file2;
  53. integer file3;
  54. integer file4;

  55. initial
  56. begin
  57. rst
  58. always @(posedge sys_clk)
  59. begin
  60. //$fdisplay(file,"%b\n",QPSK_OUT);
  61. $fwrite(file1,"%d\n",datai);
  62. $fwrite(file2,"%d\n",i_lpf);
  63. $fwrite(file3,"%d\n",chouqu_out1);
  64. $fwrite(file4,"%d\n",result1);
  65. end
  66. initial
  67. begin
  68. #1000000 $fclose(file1);
  69.      $fclose(file2);
  70.      $fclose(file3);
  71.      $fclose(file4);
  72. end
  73. endmodule

复制代码


呃,原来是$fclose后还继续跑,不再写了的话,在后面加个$stop应该也可以吧!

看不出,你试一下改一下fopen的文件路径,去掉空格行不行!

谢谢啦,已经解决啦,嘿嘿不应该把$fwrite写在always块里,如果这样每当时钟上升沿就会写入文件,而我在100000时刻就把文件关闭了,所以在运行100000时间后会出现错误,所以我把$fwrite写在initial模块里了,重复写100000次,这样就不会报错了,改后程序如下:

  1. `timescale 1us/100ps
  2. module QPSK_SYS_top_tf;

  3. reg sys_clk;//250KHz
  4. reg reset_n;//复位
  5. parameter [31:0]FCW_CA=1717986918;//DDS频率控制字,由250KHz得到100KHz载频
  6. parameter [31:0]FCW_10K=171798680;//从250KHz分频得到10K分频控制字
  7. parameter [31:0]FCW_50K=858993400;//从250KHz分频得到50K分频控制字

  8. wire Base_Signal;
  9. wire signed [1:0]Ik;
  10. wire signed [1:0]Qk;
  11. wire signed [1:0]Ik_nc10;
  12. wire signed [1:0]Qk_nc10;
  13. wire signed[11:0] Ik_bsf;
  14. wire signed[11:0] Qk_bsf;
  15. wire signed[11:0]Ik_f;
  16. wire signed[11:0]Qk_f;
  17. wire signed[11:0] I_OUT;//输出
  18. wire signed[11:0] Q_OUT;//输出
  19. wire signed[11:0] QPSK_OUT;
  20. wire signed[11:0]fsin_o;
  21. wire signed[11:0]fcos_o;
  22. wire signed[11:0]Ik_nc;
  23. wire signed[11:0]Qk_nc;
  24. QPSK_SYS_top QPSK_SYS_top(
  25. .sys_clk(sys_clk),//240MHz太大了  改为250KHz
  26. .reset_n(reset_n),//复位
  27. .FCW_CA(FCW_CA),//DDS频率控制字
  28. .FCW_10K(FCW_10K),//10K分频控制字
  29. .FCW_50K(FCW_50K),//50K分频控制字
  30. .QPSK_OUT(QPSK_OUT),
  31. .Q_OUT(Q_OUT),
  32. .I_OUT(I_OUT),
  33. .Ik_bsf(Ik_bsf),
  34. .Qk_bsf(Qk_bsf),
  35. .Ik(Ik),
  36. .Qk(Qk),
  37. .Ik_nc10(Ik_nc10),
  38. .Qk_nc10(Qk_nc10),
  39. .Ik_nc(Ik_nc),
  40. .Qk_nc(Qk_nc),
  41. .Ik_f(Ik_f),
  42. .Qk_f(Qk_f),
  43. .fsin_o(fsin_o),
  44. .fcos_o(fcos_o)
  45. );

  46. always #2 sys_clk<=~sys_clk;

  47. integer file1;
  48. integer file2;
  49. integer file3;
  50. integer file4;
  51. integer file5;
  52. integer file6;


  53. initial
  54. begin
  55.         sys_clk<=0;
  56.         reset_n<=0;
  57.         file1=$fopen("D:/FPGA relatation/Quartus codes/QPSK_SYS_top/QPSK_OUT.txt","w");
  58.         file2=$fopen("D:/FPGA relatation/Quartus codes/QPSK_SYS_top/QPSK_OUT2.txt","w");
  59.         file3=$fopen("D:/FPGA relatation/Quartus codes/QPSK_SYS_top/fcos_o.txt","w");
  60.         file4=$fopen("D:/FPGA relatation/Quartus codes/QPSK_SYS_top/Ik_bsf.txt","w");
  61.         file5=$fopen("D:/FPGA relatation/Quartus codes/QPSK_SYS_top/Ik.txt","w");
  62.         file6=$fopen("D:/FPGA relatation/Quartus codes/QPSK_SYS_top/Ik_f.txt","w");
  63.         #2 reset_n<=1;
  64. end

  65. //always @(posedge sys_clk)
  66. //begin
  67. //        //$fdisplay(file,"%b\n",QPSK_OUT);       
  68. //        $fwrite(file1,"%d\n",QPSK_OUT);       
  69. //        $fwrite(file2,"%b\n",QPSK_OUT);
  70. //        $fwrite(file3,"%d\n",fcos_o);
  71. //        $fwrite(file4,"%d\n",Ik_bsf);       
  72. //end

  73. initial
  74. begin
  75. #2 repeat(100000)
  76. begin
  77. #4 $fwrite(file1,"%d\n",QPSK_OUT);       
  78.         $fwrite(file2,"%b\n",QPSK_OUT);
  79.         $fwrite(file3,"%d\n",fcos_o);
  80.         $fwrite(file4,"%b\n",Ik_bsf);       
  81.         $fwrite(file5,"%b\n",Ik);       
  82.         $fwrite(file6,"%d\n",Ik_f);       
  83. end
  84. #100000 $fclose(file1);
  85.                                         $fclose(file2);
  86.                                         $fclose(file3);
  87.                                         $fclose(file4);
  88.                                         $fclose(file5);
  89.                                         $fclose(file6);
  90. end


  91. endmodule

复制代码



应该可以,不过我没试哈

小编的测试文件写的真好。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top