上周微信群里的一个小伙伴提到的一个关于仿真中不达预期的一个问题,其中牵涉到关于仿真中信号竞争等问题。这个问题之前算是不求甚解。这周经一位大佬的提点,结合GPT4的帮助,来好好梳理下这个问题。
由于本人对底层不求甚解,仅做总结与梳理,真实细节还需扒代码底层,有感兴趣的可自行去探索。
不得不说科技改变生活,GPT确实强大。
不达预期的仿真行为
先来看一个简单的电路:
caseclass Test() extends Component { val pc=outUInt(8bits) setAsReg() init(0) val inst=inUInt(8bits) pc:=pc+1 }
小伙儿的需求很简单。在仿真中根据当前的pc值加1后反馈给inst输入引脚。不假思索即可写出下面的仿真代码:
object TestApp extendsApp { 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:170pc:0isnt_in:64clk:true time:180pc:1isnt_in:1clk:true time:190pc:2isnt_in:2clk:true time:200pc:3isnt_in:3clk:true time:210pc:4isnt_in:4clk:true time:220pc:5isnt_in:5clk:true time:230pc:6isnt_in:6clk:true time:240pc:7isnt_in:7clk:true time:250pc:8isnt_in:8clk: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:170pc:1isnt_in:51clk:true time:180pc:2isnt_in:2clk:true time:190pc:3isnt_in:3clk:true time:200pc:4isnt_in:4clk:true time:210pc:5isnt_in:5clk:true time:220pc:6isnt_in:6clk:true time:230pc:7isnt_in:7clk:true time:240pc:8isnt_in:8clk:true time:250pc:9isnt_in:9clk:true
如果觉得能用即可,那么针对这种问题看到这里就可以了~
审核编辑:刘清
-
高电平
+关注
关注
6文章
102浏览量
20957 -
CLK
+关注
关注
0文章
122浏览量
16912 -
GPT
+关注
关注
0文章
302浏览量
14869
原文标题:借助GPT4好好理解下仿真中竞争的处理
文章出处:【微信号:Spinal FPGA,微信公众号:Spinal FPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论