启动 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)
我试图使用 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)