上周微信群里的一個(gè)小伙伴提到的一個(gè)關(guān)于仿真中不達(dá)預(yù)期的一個(gè)問題,其中牽涉到關(guān)于仿真中信號競爭等問題。這個(gè)問題之前算是不求甚解。這周經(jīng)一位大佬的提點(diǎn),結(jié)合GPT4的幫助,來好好梳理下這個(gè)問題。
由于本人對底層不求甚解,僅做總結(jié)與梳理,真實(shí)細(xì)節(jié)還需扒代碼底層,有感興趣的可自行去探索。
不得不說科技改變生活,GPT確實(shí)強(qiáng)大。
不達(dá)預(yù)期的仿真行為
先來看一個(gè)簡單的電路:
caseclass Test() extends Component { val pc=outUInt(8bits) setAsReg() init(0) val inst=inUInt(8bits) pc:=pc+1 }
小伙兒的需求很簡單。在仿真中根據(jù)當(dāng)前的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) } }
看起來沒啥毛病是吧,時(shí)鐘上升沿之后將pc+1驅(qū)動(dòng)給dut.inst。然而仿真結(jié)果卻并不如人意:
按照正常的理解,這里面inst的值應(yīng)該等于pc的值加1才行對吧,然而仿真波形卻顯示inst的值和pc的值一致。仿真器腦抽了?
在執(zhí)行inst賦值前加上一行打?。?/p>
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) } }
仿真執(zhí)行時(shí)打印信息如下:
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
這就有點(diǎn)意思了,在170時(shí)刻,明明clk已經(jīng)是高電平,按道理來時(shí)鐘上升沿已然產(chǎn)生,然而pc打印出來的值仍然是0!
先說這里如何修復(fù)這個(gè)問題,你只需添加一個(gè)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) } }
如此,即可符合仿真預(yù)期:
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
如果覺得能用即可,那么針對這種問題看到這里就可以了~
審核編輯:劉清
-
高電平
+關(guān)注
關(guān)注
6文章
149瀏覽量
21387 -
CLK
+關(guān)注
關(guān)注
0文章
127瀏覽量
17171 -
GPT
+關(guān)注
關(guān)注
0文章
354瀏覽量
15379
原文標(biāo)題:借助GPT4好好理解下仿真中競爭的處理
文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論