首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于将verilog输出写入文本文件的测试工作台

用于将verilog输出写入文本文件的测试工作台
EN

Stack Overflow用户
提问于 2014-09-01 21:39:34
回答 1查看 53.2K关注 0票数 4

我无法在文本文件中获得正确的输出,但是在modelsim中模拟是相当不错的。但是当把它写到文本文件时,我每次输入都会得到XX。可能存在一些语法错误或其他错误。如果有帮助,请写下测试工作台,用于写入触发器(例如)的dout (输出),每个dout(输出)都显示在文本文件中的新行中。

代码:

代码语言:javascript
复制
module LFSR( clk,reset,out);
parameter width =4;
input clk,reset;
output [width-1:0] out ;
reg [width-1:0] lfsr;

integer r;
wire feedback = lfsr[width-1]^lfsr[width-2];


always @(posedge clk)
  if (reset)
    begin
      lfsr <= 4'b1000; 
    end
  else
    begin
      lfsr[0] <= feedback;
      for(r=1;r<width;r=r+1)
        lfsr[r]<=lfsr[r-1];
    end

  assign out=lfsr;
endmodule

Testbench:

代码语言:javascript
复制
module aaatest();

  parameter width =4;
  reg clk,reset;
  wire [width-1:0] out;
  reg [width-1:0] lfsr[13:0];
  integer f,i;

  initial
    begin
      f = $fopen("output.txt","w");
    end

    LFSR patt (clk,reset,out);

    always #5 clk=~clk;

    initial begin
      clk=1; reset=1;
      #10 reset=0;
      # 140 $stop;
    end

    initial
      begin
        clk=1;
        for (i = 0; i<14; i=i+1)
          @(posedge clk)
            lfsr[i]<= out;
      end

    initial begin
      for (i = 0; i<14; i=i+1)
        $fwrite(f,"%b\n",lfsr[i]);
    end

    initial begin
      $display("clk out");
      $monitor("%b,%b", clk, out);
    end   

    initial
      begin
        $fclose(f);  
      end
    endmodule
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-02 14:53:44

我希望您考虑以下代码部分:

代码语言:javascript
复制
initial begin
  f = $fopen("output.txt","w");
end

initial begin
  for (i = 0; i<14; i=i+1)
    $fwrite(f,"%b\n",lfsr[i]);
end

initial begin
  $fclose(f);  
end

在描述硬件时,我们有一个大规模的并行模拟。所有缩写都应在同一时间开始,时间为0。

如果这样做是有效的,因为不能保证在写入之前文件会被打开,那么您甚至在重置模拟逻辑之前就在时间0写入了文件。

下面这样的内容可能更合适:

代码语言:javascript
复制
initial begin
  f = $fopen("output.txt","w");

  @(negedge reset); //Wait for reset to be released
  @(posedge clk);   //Wait for fisrt clock out of reset

  for (i = 0; i<14; i=i+1) begin
    $fwrite(f,"%b\n",lfsr[i]);
  end

  $fclose(f);  
end

要跟进Gregs的建议,重置发布得太早了,可以考虑类似以下内容:

代码语言:javascript
复制
initial begin
  clk=0; reset=1; //Clock low at time zero
  @(posedge clk);
  @(posedge clk);
  reset=0;
  # 140 $stop;
end

其在2个时钟上升沿保持复位断言。

使用工作示例进行更新

有一些奇怪的事情发生了,你在#140之后调用$stop (而不是$finish),但也试图循环14次,$stop意味着只执行4次循环。

您的测试程序由两个并行工作的initial begins组成,而不是由一个顺序执行的程序组成。您没有延迟地写出您的文本文件,并且您编写了lfsr的缓冲版本,而不是直接写入lfsr输出。

下面的示例正确模拟并写入您要查找的文本文件:

代码语言:javascript
复制
module aaatest();

  parameter width =4;
  reg   clk,reset;
  wire [width-1:0] out;
  reg  [width-1:0] lfsr[13:0];
  integer f,i;

  LFSR patt (clk,reset,out);

  always #5 clk=~clk;

  //Clock and reset release
  initial begin
    clk=0; reset=1; //Clock low at time zero
    @(posedge clk);
    @(posedge clk);
    reset=0;
  end

  initial begin
    f = $fopen("output.txt","w");

    @(negedge reset); //Wait for reset to be released
    @(posedge clk);   //Wait for fisrt clock out of reset

    for (i = 0; i<14; i=i+1) begin
      @(posedge clk);
      lfsr[i] <= out;
      $display("LFSR %b", out);
      $fwrite(f,"%b\n",   out);
    end

    $fclose(f);  

    $finish;
  end
endmodule
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25607124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档