5

我无法在文本文件中获得正确的输出,但是在 modelsim 中的模拟非常好.. 但是在将其写入文本文件时,我会为每个输入获取 XX。可能有一些语法错误或其他一些错误。如果有任何可以帮助请写下测试台以编写触发器(例如)的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

试验台:

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
4

1 回答 1

16

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

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。

如果这完全可行,因为无法保证在您写入文件之前会打开文件,您甚至在重置模拟逻辑之前在零时间写入文件。

像下面这样的东西可能更合适:

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 的建议,过早发布的重置考虑类似于以下内容:

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

在 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
于 2014-09-02T06:53:43.510 回答