EDAPlayground运行Verilog代码提示达到最大运行时长问题求助
问题原因分析
- 最直接原因是测试台缺少仿真终止逻辑:你编写的测试模块仅定义了输入激励,未添加
$finish系统函数终止仿真,时钟生成的always块会无限翻转时钟,导致仿真持续运行,触发EDAPlayground平台的最大运行时间限制。 - 设计代码存在逻辑隐患:时序块内的三个
if(all == xx)分支为并行判断,虽然当前逻辑不会出现冲突,但使用else if替代可避免多分支同时触发的风险,同时也能减少不必要的运算。 - 二进制数语法无错误:你写的
2'b00、4'b0111等二进制表示语法符合Verilog规范,编译可正常通过即可证明该部分没有问题。
修复方案
1. 修改测试台添加终止逻辑
在测试模块的initial块末尾添加足够的运行延时后调用$finish终止仿真,修改后的测试文件如下:
module test; reg clk; reg rst; reg x; reg ce; // Outputs wire z; // Instantiate the Unit Under Test (UUT) hazimodul uut ( .clk(clk), .rst(rst), .x(x), .ce(ce), .z(z) ); initial begin // Initialize Inputs clk = 0; rst = 0; x=0; ce=0; #10; rst<=1; #20; rst<=0; #30 ce<=1; #40 x<=1; #80 x<=0; #90 x<=1; // 新增:等待所有激励生效后终止仿真 #200; $finish; end always #5 clk <=~clk; endmodule
2. 优化设计代码逻辑
将并行if改为else if,消除逻辑隐患,修改后的设计文件如下:
module hazimodul( input clk, input rst, input ce, input x, output z ); reg[1:0] all; reg[3:0] y; reg zout; // reg[0:0]等价于reg,可简化写法 always@(posedge clk) begin if(rst) begin zout <= 1'b0; all <= 2'b00; y <= 4'b0111; end else if(ce) begin if(all == 2'b00) begin if(x== 1'b0) zout<=1'b0; else all <=2'b01; end else if(all==2'b01) begin zout <= y[3]; // y[3:3]等价于y[3],可简化写法 y <= {y[2:0],y[3]}; if (y == 4'b0111) all <= 2'b10; end else if(all==2'b10) begin if(x == 1'b0) all <= 2'b00; end end end assign z = zout; endmodule
修改完成后即可在EDAPlayground平台正常完成仿真,不会触发超时错误。
内容的提问来源于stack exchange,提问作者toorelevant
相关产品推荐
相关产品推荐

