Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在systemverilog测试台上从循环文件中读取输入刺激?_Verilog_Hardware_System Verilog_Test Bench - Fatal编程技术网

如何在systemverilog测试台上从循环文件中读取输入刺激?

如何在systemverilog测试台上从循环文件中读取输入刺激?,verilog,hardware,system-verilog,test-bench,Verilog,Hardware,System Verilog,Test Bench,我需要自动验证我的硬件设计。 我以前用VHDL做的是: 使用随机数据创建.txt文件,超过200k(Python) 通过VHDL测试台采集数据,作为硬件设计的输入,然后采集结果 将结果与用C/C++/Python等编写的模型生成的结果进行比较 每件事都是通过终端中启动的脚本来完成的 我想在系统Verilog中做同样的事情,但我遇到了一些麻烦 输入数据文件的典型行(200k中的一行)为: 1 0000000000000000000 1110101 0000000000000000000000000

我需要自动验证我的硬件设计。 我以前用VHDL做的是:

  • 使用随机数据创建.txt文件,超过200k(Python)

  • 通过VHDL测试台采集数据,作为硬件设计的输入,然后采集结果

  • 将结果与用C/C++/Python等编写的模型生成的结果进行比较

  • 每件事都是通过终端中启动的脚本来完成的

    我想在系统Verilog中做同样的事情,但我遇到了一些麻烦

    输入数据文件的典型行(200k中的一行)为: 1 0000000000000000000 1110101 000000000000000000000000000001010

    这是我的代码:

    initial begin
    
        fin_pointer= $fopen("../common/divisorInSample.txt","r");
        fout_pointer= $fopen("../common/divisorHWResults.txt","w");
    
        @(posedge rst_n);
        @(posedge clk);
        while (! $feof(fin_pointer)) begin
          $fscanf(fin_pointer,"%b %b %b\n",usigned,dividend,divisor);
          valid=1;
          @(posedge clk);
          valid=0;
          @(posedge res_ready);
          $fwrite(fout_pointer,"%b %b\n",quotient,reminder);
        end
        $finish;
        $fclose(fin_pointer);
        $fclose(fout_pointer);
    end
    
    我在fscanf中尝试了不同的格式,如“%b%b%b”。 但我总是有同样的行为: 代码似乎在第一次执行“fwrite”后停止,因为我可以在输出文件中看到正确的结果。
    我怎样才能解决这个问题?谢谢

    我在Vivado 2018.2中使用了您的代码,没有发现任何问题

    我不得不做一些更改,但我没有触及文件I/O代码的核心

    integer fin_pointer,fout_pointer;
    reg  usigned;
    reg  [31:0] dividend,divisor;
    
    task ee_se;
     begin
    
        fin_pointer= $fopen("../../../../tbench/se_ee_in.txt","r");
        if (fin_pointer==0)
        begin
           $display("Could not open file '%s' for reading","se_ee_in.txt");
           $stop;     
        end
        fout_pointer= $fopen("../../../../se_ee_out.txt","w");
        if (fout_pointer==0)
        begin
           $display("Could not open file '%s'  for writing","se_ee_out.txt");
           $stop;     
        end
    
    //    @(posedge rst_n);
    //    @(posedge clk);
        # 100;
        while (! $feof(fin_pointer)) begin
          $fscanf(fin_pointer,"%b %b %b\n",usigned,dividend,divisor);
    //      valid=1;
    //      @(posedge clk);
          #100 ; 
    //      valid=0;
    //      @(posedge res_ready);
          $fwrite(fout_pointer,"%b %b\n",~dividend,~divisor);
        end
        $finish;
        $fclose(fin_pointer);
        $fclose(fout_pointer);
    end
    endtask
    
    输入文件se_ee_in.txt:

    1 00000000000000000000000001110101 00000000000000000000000000001010
    0 00000000000000000000000001110111 00000000000000000000000000001111
    1 00000000000000000000000001111111 00000000000000000000000000001000
    
    输出文件se_ee_out.txt:

    11111111111111111111111110001010 11111111111111111111111111110101
    11111111111111111111111110001000 11111111111111111111111111110000
    11111111111111111111111110000000 11111111111111111111111111110111
    

    您并没有从“fin_pointer”读取数据,您只使用它来检查文件的结尾。相反,你有一些奇怪的“s”,你试图从中读取。对不起,只是复制代码的错误!显然我是从文件指针上读的我用的是ModelSim的最新版本。。。你知道还有其他的方法来做同样的事情吗?请注意,我的使用、股息和除数被声明为“逻辑”!你认为这可能是问题所在吗?我下载了VIvado,但仍然没有停止模拟!就好像它在最后一次循环时被卡住了