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