在 UVM 验证环境里,sequence 是“交易生成器”,但写好一个 sequence 之后,它究竟是怎么跑起来的?调用了 seq.start(sqr) 之后,UVM 内部经历了哪些“仪式”和“暗箱操作”?
start() 之后发生了什么?
start(sqr) 像是一个发令枪。UVM 会先调用 pre_start()(一般很少重载),然后正式进入 task start() 的流程。核心是执行 pre_body() → body() → post_body() 三段式。其中 body() 是用户定义的事务生成主循环,而 pre_body() 和 post_body() 是可供重载的钩子,常用于开关记录、配置更新或全局状态重置。注意,只有将 sequence 设为 set_automatic_phase_handling(0) 时,pre/post_body 才由用户自己调用,否则 UVM 会在 phase 上下文中自动执行——但大多数时候我们直接默认。
在 body() 内部,每产生一条 transaction,都需要经过 start_item → randomize → finish_item 三步。这三步不是摆设:start_item 向 sequencer 申请仲裁,获取总线访问权;randomize 完成字段随机化;finish_item 将事务交给 sequencer 的 driver,并等待 driver 返回响应(如果是双向握手)。
