启动 EPWave 时出错:[无法解析文件:在 header 中找不到 $timescale。]

Error launching EPWave: [Could not parse file: $timescale not found in the header.]

我试图使用 icarus verilog 作为我的模拟器在 EDA playground 上制作一个波特率为 9600 的 UART 发射器。这是我的代码:

`timescale 1s/1us

module UART_9600_8N1(
  output reg trans,
  input [7:0] bitsin
);
  reg [9:0] storagebits;
  reg state;
  integer k;
  parameter baud = 9600;
  
  initial
    begin
      storagebits <= 10'd0;
      state <= 1'd0;
      trans <= 1'd1;
    end
  
  always@(state)
    if(!state)
      begin
        #(1/baud) state <= ~state;
        #(9/baud) state <= ~state;
      end
  
  always@(state)
    if(!state)
      begin
        trans <= 1'b1;
        storagebits <= {1'b0, bitsin, 1'b1};
      end

  always@(state)
    if(state)
      begin
        #(1/baud) trans <= storagebits[0];
        for(k=1; k<10; k=k+1)
          #(1/baud) trans <= storagebits[k];
      end
endmodule

现在测试台代码:

`timescale 1s/1us

module UARTtester;
  wire transmitting;
  reg [7:0] inputbits;
  parameter testbenchbaud= 9600;
  
  UART_9600_8N1 testing (transmitting, inputbits);
  defparam testing.baud = 9600;
  
  initial
    begin
      $dumpfile("testuart.vcd");
      $dumpvars(1, UARTtester);
      #0 inputbits = 8'd0;
      while(1)
        begin
          #(10/testbenchbaud) inputbits <= inputbits+8'd1;
        end
      #1 $finish;
    end
endmodule

当我尝试执行代码并观察输出图时,出现以下情况:

[2021-12-19 05:28:45 EST] iverilog '-Wall' '-g2012' design.sv testbench.sv  && unbuffer vvp a.out  
VCD info: dumpfile testuart.vcd opened for output.
Finding VCD file...
./testuart.vcd
[2021-12-19 05:28:47 EST] Opening EPWave...
Error launching EPWave: [Could not parse file: $timescale not found in the header.]. Could not load './testuart.vcd'
Done

谁能告诉我哪里出错了,我该怎么做才能纠正错误?感谢任何帮助。

我同意这不是很有帮助的错误消息。

当您在 edaplayground 上使用 Cadence 模拟器时,您会收到一条更有用的错误消息:

Execution interrupted or reached maximum runtime.

您的测试台有一个无限循环,导致模拟无法结束。要修复它,您需要更改:

while(1)

至:

repeat (1000)

这允许模拟正常结束。

但是,您的延迟表达式很奇怪:#(10/testbenchbaud)。这解析为 10/9600,这是一个结果为 0 的整数除法。当您 运行 模拟时,您不会得到任何延迟。它的行为类似于:

#(0) inputbits <= inputbits+8'd1;

您可能预计会有大约 104us 的延迟。解决这个问题的一种方法是使用浮点除法。使用带常数的小数点:10.0。变化:

      #(10/testbenchbaud) inputbits <= inputbits+8'd1;

至:

      #(10.0/testbenchbaud) inputbits <= inputbits+8'd1;

你的设计也有类似的问题:#(1/baud),等等

使用:

#(1.0/baud)