違反(fǎn)“时(shí)鐘(zhōng)沿前(qián)看(kàn)条(tiáo)件(jiàn)”原則的(de)分(fēn)析
本(běn)文(wén)为(wèi)明(míng)德揚原創文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处!作者(zhě):肖肖肖
MDY有(yǒu)一(yī)条(tiáo)非(fēi)常重(zhòng)要(yào)的(de)看(kàn)波(bō)形技巧,即“时(shí)鐘(zhōng)上(shàng)升(shēng)沿前(qián)看(kàn)条(tiáo)件(jiàn)”的(de)技巧,意(yì)思(sī)就(jiù)是(shì)在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿前(qián),看(kàn)条(tiáo)件(jiàn)信(xìn)号(hào),看(kàn)到(dào)什麼(me)值就(jiù)是(shì)值。如(rú)下(xià)图(tú)所(suǒ)示:
这(zhè)一(yī)条(tiáo)技巧,对(duì)于(yú)刚学習FPGA的(de)人(rén)来(lái)说(shuō),非(fēi)常之实用(yòng)。
但是(shì),部(bù)分(fēn)工程师(shī)在(zài)做仿真(zhēn)时(shí),有(yǒu)时(shí)候会(huì)出(chū)現(xiàn)違反(fǎn)这(zhè)一(yī)原則的(de)奇怪現(xiàn)象(xiàng)。例如(rú)下(xià)面(miàn)这(zhè)个(gè)案(àn)例。
關(guān)于(yú)在(zài)仿真(zhēn)软(ruǎn)件(jiàn)中(zhōng),为(wèi)什麼(me)計(jì)數器的(de)判定(dìng)会(huì)在(zài)不(bù)滿足加一(yī)条(tiáo)件(jiàn)的(de)时(shí)候進(jìn)行加一(yī)操作(如(rú)下(xià)图(tú)所(suǒ)示)。計(jì)數器cnt_col的(de)加1条(tiáo)件(jiàn)是(shì)din_vld,按照原則,第(dì)4个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿的(de)时(shí)候,din_vld應(yìng)該为(wèi)0,計(jì)數器不(bù)應(yìng)該加1,但事(shì)实上(shàng)是(shì)加1了(le),这(zhè)是(shì)怎麼(me)回(huí)事(shì)?我(wǒ)们(men)舉另(lìng)一(yī)个(gè)例子来(lái)说(shuō)明(míng)这(zhè)个(gè)問(wèn)題(tí)。
功能(néng)要(yào)求如(rú)下(xià):複位後(hòu),din_vld 不(bù)定(dìng)时(shí)等于(yú)1,當din_vld出(chū)現(xiàn)3个(gè)或(huò)超过(guò)3个(gè)周期(qī)的(de)高(gāo)電(diàn)平脈沖时(shí),将第(dì)三(sān)个(gè)周期(qī)时(shí)对(duì)應(yìng)的(de)din值賦給(gěi)dout,其他(tā)时(shí)候dout保持(chí)不(bù)變(biàn)。
根(gēn)據(jù)功能(néng)要(yào)求,写出(chū)代(dài)碼後(hòu)用(yòng)modelsim進(jìn)行仿真(zhēn),效果(guǒ)如(rú)下(xià)图(tú):
然後(hòu)發(fà)現(xiàn)仿真(zhēn)的(de)波(bō)形和(hé)我(wǒ)们(men)預期(qī)的(de)波(bō)形并不(bù)一(yī)致(zhì)!!

計(jì)數器cnt在(zài)din_vld == 0 的(de)时(shí)候就(jiù)已經(jīng)開(kāi)始計(jì)數了(le)。
查看(kàn)代(dài)碼,計(jì)數器cnt的(de)加一(yī)条(tiáo)件(jiàn)是(shì):add_cnt = din_vld == 1 && flag == 0 。
也(yě)就(jiù)是(shì)说(shuō),信(xìn)号(hào)din_vld在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿处由(yóu)0變(biàn)1的(de)时(shí)候,仿真(zhēn)软(ruǎn)件(jiàn)把信(xìn)号(hào)din_vld的(de)值取(qǔ)为(wèi)1了(le)。
那(nà)麼(me)会(huì)出(chū)現(xiàn)这(zhè)種(zhǒng)情(qíng)況的(de)原因(yīn)是(shì)什麼(me)呢?
这(zhè)里(lǐ)是(shì)软(ruǎn)件(jiàn)仿真(zhēn),是(shì)软(ruǎn)件(jiàn)模拟真(zhēn)实的(de)電(diàn)路(lù)情(qíng)況。但是(shì),软(ruǎn)件(jiàn)模拟是(shì)有(yǒu)缺陷的(de),无論软(ruǎn)件(jiàn)如(rú)何模拟,本(běn)質(zhì)上(shàng)它(tā)都是(shì)串行執行的(de)代(dài)碼,是(shì)一(yī)条(tiáo)一(yī)条(tiáo)指令執行的(de)。
在(zài)仿真(zhēn)文(wén)件(jiàn)里(lǐ),有(yǒu)两(liǎng)个(gè)initial語(yǔ)句(jù),一(yī)个(gè)是(shì)産生(shēng)时(shí)鐘(zhōng)的(de),一(yī)个(gè)是(shì)産生(shēng)din_vld的(de),如(rú)下(xià)图(tú)。
按照verilog的(de)語(yǔ)法,这(zhè)两(liǎng)个(gè)initial是(shì)并行執行的(de)。但事(shì)实上(shàng)软(ruǎn)件(jiàn)執行是(shì)有(yǒu)先(xiān)後(hòu)的(de)。很有(yǒu)可(kě)能(néng)先(xiān)執行了(le)din_vld變(biàn)1的(de)代(dài)碼,再執行了(le)clk由(yóu)0變(biàn)1的(de)代(dài)碼,这(zhè)種(zhǒng)情(qíng)況下(xià),在(zài)时(shí)鐘(zhōng)的(de)上(shàng)升(shēng)沿就(jiù)会(huì)采到(dào)din_vld为(wèi)1,因(yīn)此(cǐ)就(jiù)会(huì)出(chū)現(xiàn)案(àn)例中(zhōng)的(de)錯誤。
这(zhè)是(shì)與(yǔ)FPGA实際的(de)電(diàn)路(lù)是(shì)不(bù)符合的(de),也(yě)就(jiù)是(shì)说(shuō)这(zhè)个(gè)其实是(shì)仿真(zhēn)缺陷的(de)問(wèn)題(tí),而(ér)不(bù)是(shì)設計(jì)問(wèn)題(tí)。
虽然不(bù)是(shì)設計(jì)問(wèn)題(tí),但仿真(zhēn)仍然要(yào)繼續,我(wǒ)们(men)需要(yào)避免这(zhè)種(zhǒng)情(qíng)況。如(rú)何避免呢?
解(jiě)決上(shàng)述問(wèn)題(tí)的(de)方(fāng)法:我(wǒ)们(men)可(kě)以(yǐ)在(zài)测試文(wén)件(jiàn)中(zhōng)給(gěi)信(xìn)号(hào)加上(shàng)一(yī)个(gè)1ns 的(de)延时(shí),这(zhè)樣(yàng)两(liǎng)个(gè)initial語(yǔ)句(jù)就(jiù)絕对(duì)不(bù)会(huì)同(tóng)时(shí)執行。
代(dài)碼如(rú)下(xià)图(tú):
用(yòng)modelsim重(zhòng)新編譯一(yī)下(xià)再仿真(zhēn),此(cǐ)时(shí)的(de)波(bō)形就(jiù)是(shì)功能(néng)要(yào)求的(de)正(zhèng)确結果(guǒ)。如(rú)下(xià)图(tú):

問(wèn)題(tí)解(jiě)決,更(gèng)多(duō)FPGA相關(guān)問(wèn)題(tí)欢迎加Q:1479512800肖肖肖 互相讨論!















