项目场景:在initial中,需要注意end前不能时延,否则会编译报错。
问题描述
我想着多添加一下延时的数自己测试看看,结果不小心在end前也添加了时延,导致我反复检查都没查出问题,
最后去看顺序块的定义,才发现end前不能添加时延!当然是initial中不可以,因为它执行一次,如果是循坏的always,那么是可以的。
顺序块中每条语句的时延总是与其前面语句执行的时间相关 点醒了我!
详细语法介绍:
https://www.runoob.com/w3cnote/verilog-statements-block.html
https://blog.youkuaiyun.com/qq_45355365/article/details/140738648
错误语法:
initial begin
tb_key <= 1'b1;
#200
tb_key <= 1'b0;
#300
tb_key <= 1'b1;
#400
tb_key <= 1'b0;
#500
tb_key <= 1'b1;
#300
tb_key <= 1'b0;
#300//错误的地方
end//软件编译发现错误的提示地方
原因分析:
由于end前添加了时延,导致延迟300个单位时间后,没有语句可以执行
解决方案:
把end前的时延删除!
我还按照其他人写的方法,用这样的方式改写了,这样似乎可读性更高。
之前的想法是:tb_key <= 1’b1 持续200后,再执行tb_key <= 1’b0
现在的想法是:执行tb_key <= 1’b1 后,延时200再执行tb_key <= 1’b0
initial begin
tb_key <= 1'b1;
#200 tb_key <= 1'b0;
#300 tb_key <= 1'b1;
#400 tb_key <= 1'b0;
#500 tb_key <= 1'b1;
#300 tb_key <= 1'b0;
end
收获:
1、可以多看语法定义
2、多看优秀的代码,学习人家是咋写的。