上周微信群里的一个小伙伴提到的一个关于仿真中不达预期的一个问题,其中牵涉到关于仿真中信号竞争等问题。这个问题之前算是不求甚解。这周经一位大佬的提点,结合GPT4的帮助,来好好梳理下这个问题。
由于本人对底层不求甚解,仅做总结与梳理,真实细节还需扒代码底层,有感兴趣的可自行去探索。
不得不说科技改变生活,GPT确实强大。
不达预期的仿真行为
先来看一个简单的威廉希尔官方网站 :
case class Test() extends Component { val pc=out UInt(8 bits) setAsReg() init(0) val inst=in UInt(8 bits) pc:=pc+1 }
小伙儿的需求很简单。在仿真中根据当前的pc值加1后反馈给inst输入引脚。不假思索即可写出下面的仿真代码:
object TestApp extends App { SimConfig.withFstWave.compile(bootTest()).doSim{dut=> dut.clockDomain.forkStimulus(10) fork{ while(true){ dut.clockDomain.waitSampling() dut.inst#=dut.pc.toInt+1 } } dut.clockDomain.waitSampling(10) } }
看起来没啥毛病是吧,时钟上升沿之后将pc+1驱动给dut.inst。然而仿真结果却并不如人意:
按照正常的理解,这里面inst的值应该等于pc的值加1才行对吧,然而仿真波形却显示inst的值和pc的值一致。仿真器脑抽了?
在执行inst赋值前加上一行打印:
object TestApp extends App { SimConfig.withFstWave.compile(bootTest()).doSim{dut=> dut.clockDomain.forkStimulus(10) fork{ while(true){ dut.clockDomain.waitSampling() println(s"time:${simTime()} pc:${dut.pc.toInt} isnt_in:${dut.inst.toInt} clk:${dut.clockDomain.clockSim.toBoolean}") dut.inst#=dut.pc.toInt+1 } } dut.clockDomain.waitSampling(10) } }
仿真执行时打印信息如下:
time:170 pc:0 isnt_in:64 clk:true time:180 pc:1 isnt_in:1 clk:true time:190 pc:2 isnt_in:2 clk:true time:200 pc:3 isnt_in:3 clk:true time:210 pc:4 isnt_in:4 clk:true time:220 pc:5 isnt_in:5 clk:true time:230 pc:6 isnt_in:6 clk:true time:240 pc:7 isnt_in:7 clk:true time:250 pc:8 isnt_in:8 clk:true
这就有点意思了,在170时刻,明明clk已经是高电平,按道理来时钟上升沿已然产生,然而pc打印出来的值仍然是0!
先说这里如何修复这个问题,你只需添加一个sleep(0):
object TestApp extends App { SimConfig.withFstWave.compile(bootTest()).doSim{dut=> dut.clockDomain.forkStimulus(10) fork{ while(true){ dut.clockDomain.waitSampling() sleep(0) println(s"time:${simTime()} pc:${dut.pc.toInt} isnt_in:${dut.inst.toInt} clk:${dut.clockDomain.clockSim.toBoolean}") dut.inst#=dut.pc.toInt+1 } } dut.clockDomain.waitSampling(10) } }
如此,即可符合仿真预期:
Log打印:
time:170 pc:1 isnt_in:51 clk:true time:180 pc:2 isnt_in:2 clk:true time:190 pc:3 isnt_in:3 clk:true time:200 pc:4 isnt_in:4 clk:true time:210 pc:5 isnt_in:5 clk:true time:220 pc:6 isnt_in:6 clk:true time:230 pc:7 isnt_in:7 clk:true time:240 pc:8 isnt_in:8 clk:true time:250 pc:9 isnt_in:9 clk:true
如果觉得能用即可,那么针对这种问题看到这里就可以了~
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !