Verilog中begin-end块是否真为顺序执行?分层事件队列存疑
Verilog顺序块(begin-end)的执行顺序问题
首先明确:不带fork的begin-end块是顺序块,语法上就规定了块内语句必须按书写的先后顺序执行,前一条语句执行完成后,才会开始执行下一条。
针对你给出的代码:
integer a; initial begin a = 1; // statement_1 $display(a); // statement_2 a = 2; // statement_3 end
这里的三条语句都是阻塞赋值或阻塞型系统任务,执行逻辑是:
- 首先执行
a = 1,完成后才会进入下一条; - 接着执行
$display(a),此时a的值已经是1,所以输出1; - 最后执行
a = 2,完成整个块的执行。
关于分层事件队列的疑问:虽然这三条语句都属于#0时间戳的Active队列,但顺序块的执行机制会保证它们的调度顺序严格遵循书写顺序。顺序块在处理时,会先将第一条语句放入Active队列并执行,执行完成后,再将第二条语句放入队列执行,以此类推——也就是说,它们并不是同时被放入队列,而是串行地被调度执行,自然就保证了顺序。
如果是带延迟的语句(比如#5 a=3;),顺序块会等待延迟时间到了之后,再执行该语句,然后才继续下一条,这也是你理解的“延迟相对于前一条语句”的原因,本质还是顺序执行的语义在起作用。
内容的提问来源于stack exchange,提问作者Ayush Gemini
相关产品推荐
相关产品推荐

