用于将verilog输出写入文本文件的测试平台

use*_*905 3 verilog vlsi

我无法在文本文件中获得正确的输出,但是在modelsim中的模拟非常好..但是在将其写入文本文件时,每次输入都获得XX.可能有一些语法错误或其他一些.如果有任何可以帮助plz写下测试工作台来写一个触发器的dout(输出)(作为一个例子),每个dout(输出)显示在文本文件的新行中.

码:

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
Run Code Online (Sandbox Code Playgroud)

试验台:

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
Run Code Online (Sandbox Code Playgroud)

Mor*_*gan 13

我想请您考虑以下代码部分:

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
Run Code Online (Sandbox Code Playgroud)

在描述硬件时,我们进行了大规模并行仿真.所有首字母都是在同一时间开始,时间为0.

如果这样可以工作,因为无法保证在写入文件之前打开文件,所以在重置模拟逻辑之前,您将在零时写入文件.

下面的内容可能更合适:

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
Run Code Online (Sandbox Code Playgroud)

为了跟进Gregs建议过早发布重置,请考虑类似于:

initial begin
  clk=0; reset=1; //Clock low at time zero
  @(posedge clk);
  @(posedge clk);
  reset=0;
  # 140 $stop;
end
Run Code Online (Sandbox Code Playgroud)

其中2个时钟上升沿保持复位.

用工作示例更新

发生了一些奇怪的事情,你之后调用$stop(Not $finish)#140但是也尝试循环14次,$ stop意味着只执行4个循环.

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

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

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
Run Code Online (Sandbox Code Playgroud)