⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨


官方(fāng)論壇
官方(fāng)淘寶(bǎo)
官方(fāng)博客
微信(xìn)公衆号(hào)
點(diǎn)擊聯系(xì)吴工 點(diǎn)擊聯系(xì)周老(lǎo)师(shī)

FPGA調試技巧01_錯誤類(lèi)型及(jí)定(dìng)位思(sī)路(lù)

發(fà)布(bù)时(shí)間(jiān):2023-04-13   作者(zhě):潘文(wén)明(míng) 浏覽量(liàng):

FPGA調試技巧01_錯誤類(lèi)型及(jí)定(dìng)位思(sī)路(lù)

作者(zhě):潘文(wén)明(míng)

 

衆所(suǒ)周知,软(ruǎn)件(jiàn)如(rú)ARMDSP、單片(piàn)機(jī)等是(shì)按照代(dài)碼的(de)順序,一(yī)步一(yī)步串行執行的(de),通(tòng)过(guò)使用(yòng)斷點(diǎn)、打(dǎ)印(yìn)LOG等方(fāng)法,順序地(dì)檢查每步的(de)執行結果(guǒ),就(jiù)能(néng)找(zhǎo)到(dào)問(wèn)題(tí),因(yīn)此(cǐ)定(dìng)位起来(lái)非(fēi)常簡單。

而(ér)FPGA代(dài)碼是(shì)并行的(de),意(yì)味着在(zài)同(tóng)一(yī)时(shí)刻,多(duō)个(gè)ALWAYS同(tóng)时(shí)執行,需要(yào)檢查每时(shí)每刻所(suǒ)有(yǒu)的(de)信(xìn)号(hào)的(de)正(zhèng)确性(xìng)。如(rú)何從衆多(duō)的(de)信(xìn)号(hào)(幾(jǐ)千(qiān)幾(jǐ)万(wàn)幾(jǐ)十(shí)万(wàn)个(gè)信(xìn)号(hào))、以(yǐ)及(jí)衆多(duō)的(de)时(shí)鐘(zhōng)周期(qī)中(zhōng),找(zhǎo)到(dào)出(chū)現(xiàn)錯誤的(de)时(shí)刻以(yǐ)及(jí)信(xìn)号(hào),非(fēi)常有(yǒu)挑戰性(xìng)。这(zhè)就(jiù)像檢查跳舞(wǔ)的(de)姿勢,您不(bù)僅要(yào)檢查脚步的(de)正(zhèng)确性(xìng),還(huán)要(yào)檢查此(cǐ)时(shí)此(cǐ)刻手(shǒu)勢等部(bù)位的(de)正(zhèng)确性(xìng),这(zhè)是(shì)面(miàn)的(de)檢查,而(ér)不(bù)是(shì)線(xiàn)的(de)檢查。

正(zhèng)是(shì)串行和(hé)并行的(de)差异(yì),導致(zhì)FPGA的(de)調試難度(dù),遠(yuǎn)遠(yuǎn)大于(yú)软(ruǎn)件(jiàn)。

同(tóng)时(shí),更(gèng)具挑戰性(xìng)的(de)是(shì),并行檢查就(jiù)意(yì)味着設計(jì)师(shī)要(yào)对(duì)所(suǒ)有(yǒu)的(de)信(xìn)号(hào)有(yǒu)深刻的(de)理解(jiě),知道(dào)每个(gè)信(xìn)号(hào)的(de)作用(yòng),以(yǐ)及(jí)此(cǐ)时(shí)此(cǐ)刻每个(gè)信(xìn)号(hào)的(de)值是(shì)多(duō)少(shǎo),容不(bù)得有(yǒu)任何模糊的(de)空間(jiān)。

綜上(shàng),FPGA相对(duì)软(ruǎn)件(jiàn),調試難度(dù)巨大,是(shì)一(yī)項艱苦(kǔ)的(de)工作。調試、查找(zhǎo)定(dìng)位問(wèn)題(tí),是(shì)FPGA工程师(shī)的(de)一(yī)項基本(běn)技術(shù),而(ér)且是(shì)必備的(de)技能(néng),掌握好(hǎo)FPGA調試技巧,意(yì)義重(zhòng)大。

明(míng)德揚MDY計(jì)劃(huà)推出(chū)一(yī)系(xì)列文(wén)章(zhāng),探讨FPGA的(de)調試技巧,以(yǐ)及(jí)如(rú)何定(dìng)位問(wèn)題(tí)和(hé)解(jiě)決問(wèn)題(tí)。本(běn)文(wén)是(shì)第(dì)一(yī)篇(piān)文(wén)章(zhāng),概述性(xìng)地(dì)講解(jiě)錯誤類(lèi)型及(jí)定(dìng)位思(sī)路(lù)。

 

第(dì)1节(jié) 錯誤類(lèi)型概述

明(míng)德揚可(kě)以(yǐ)将FPGA的(de)錯誤類(lèi)型分(fēn)成(chéng)三(sān)種(zhǒng):软(ruǎn)件(jiàn)工具錯誤、語(yǔ)法編譯錯誤以(yǐ)及(jí)功能(néng)錯誤。

软(ruǎn)件(jiàn)工具錯誤,是(shì)指錯誤使用(yòng)如(rú)VIVADOQUARTUS等软(ruǎn)件(jiàn),,或(huò)者(zhě)软(ruǎn)件(jiàn)檢查出(chū)的(de)非(fēi)代(dài)碼性(xìng)的(de)錯誤。例如(rú)软(ruǎn)件(jiàn)的(de)license問(wèn)題(tí)、管(guǎn)脚配置問(wèn)題(tí)、缺少(shǎo)文(wén)件(jiàn)問(wèn)題(tí)、缺少(shǎo)庫文(wén)件(jiàn)問(wèn)題(tí)等。

語(yǔ)法編譯錯誤,是(shì)指不(bù)符合VERILOG語(yǔ)法規則而(ér)引出(chū)的(de)錯誤,例如(rú)忘了(le)加分(fēn)号(hào),信(xìn)号(hào)未定(dìng)義等。

功能(néng)錯誤,是(shì)指不(bù)符合設計(jì)目标(biāo),與(yǔ)預期(qī)不(bù)一(yī)致(zhì)的(de)邏輯性(xìng)、邏輯性(xìng)錯誤。

对(duì)于(yú)初学者(zhě),大部(bù)分(fēn)时(shí)間(jiān)花在(zài)解(jiě)決软(ruǎn)件(jiàn)工具錯誤以(yǐ)及(jí)語(yǔ)法編譯錯誤上(shàng),这(zhè)是(shì)由(yóu)于(yú)不(bù)熟悉而(ér)導致(zhì)的(de);而(ér)專業的(de)FPGA工程师(shī),大部(bù)分(fēn)时(shí)間(jiān)都花在(zài)定(dìng)位功能(néng)錯誤上(shàng)了(le),可(kě)以(yǐ)说(shuō)FPGA工程师(shī),一(yī)半的(de)时(shí)間(jiān)都花在(zài)功能(néng)錯誤的(de)定(dìng)位及(jí)修正(zhèng)上(shàng)。

下(xià)面(miàn),笔(bǐ)者(zhě)将逐个(gè)讨論每種(zhǒng)錯誤的(de)解(jiě)決思(sī)路(lù)。

 

第(dì)2节(jié) 软(ruǎn)件(jiàn)工具錯誤

2.1 分(fēn)辨問(wèn)題(tí)類(lèi)型

软(ruǎn)件(jiàn)工具錯誤,是(shì)指錯誤使用(yòng)软(ruǎn)件(jiàn),如(rú)VIVADOQUARTUS,或(huò)者(zhě)由(yóu)软(ruǎn)件(jiàn)檢查出(chū)的(de)非(fēi)代(dài)碼性(xìng)的(de)錯誤。例如(rú)软(ruǎn)件(jiàn)的(de)license問(wèn)題(tí)、管(guǎn)脚配置問(wèn)題(tí)、缺少(shǎo)文(wén)件(jiàn)問(wèn)題(tí)、缺少(shǎo)庫文(wén)件(jiàn)問(wèn)題(tí)等。

 


如(rú)上(shàng)图(tú)是(shì)QUARTUS软(ruǎn)件(jiàn)發(fà)出(chū)的(de)錯誤提(tí)示。对(duì)于(yú)錯誤提(tí)示,我(wǒ)们(men)必須認真(zhēn)閱读(dú),抓關(guān)鍵字(zì),不(bù)要(yào)依賴翻譯软(ruǎn)件(jiàn),因(yīn)为(wèi)这(zhè)些錯誤提(tí)示通(tòng)常来(lái)说(shuō)不(bù)会(huì)很難的(de),看(kàn)多(duō)幾(jǐ)遍(biàn)就(jiù)熟悉了(le)。

其次(cì),学会(huì)分(fēn)辨是(shì)软(ruǎn)件(jiàn)工具問(wèn)題(tí),還(huán)是(shì)語(yǔ)法問(wèn)題(tí)。通(tòng)常来(lái)说(shuō),語(yǔ)法問(wèn)題(tí)一(yī)般会(huì)提(tí)示您的(de)哪一(yī)份代(dài)碼以(yǐ)及(jí)哪一(yī)行出(chū)錯。如(rú)果(guǒ)錯誤提(tí)示里(lǐ),沒(méi)有(yǒu)跟哪一(yī)份代(dài)碼關(guān)聯起来(lái),一(yī)般就(jiù)是(shì)软(ruǎn)件(jiàn)工具錯誤了(le)。

 

遇到(dào)软(ruǎn)件(jiàn)錯誤的(de)問(wèn)題(tí),可(kě)以(yǐ)通(tòng)过(guò)搜索問(wèn)題(tí)或(huò)者(zhě)咨詢老(lǎo)师(shī)来(lái)解(jiě)決。

2.2 方(fāng)法1:搜索

对(duì)于(yú)软(ruǎn)件(jiàn)問(wèn)題(tí),要(yào)相信(xìn)您肯定(dìng)不(bù)是(shì)第(dì)一(yī)个(gè)吃螃蟹,大概率网(wǎng)上(shàng)会(huì)有(yǒu)人(rén)咨詢过(guò)該問(wèn)題(tí),热(rè)心(xīn)的(de)网(wǎng)友会(huì)留有(yǒu)詳细(xì)的(de)答(dá)案(àn),所(suǒ)以(yǐ)最(zuì)好(hǎo)的(de)方(fāng)式就(jiù)是(shì)去(qù)搜索了(le)。

把錯誤提(tí)示複制後(hòu)去(qù)百(bǎi)度(dù)搜索(软(ruǎn)件(jiàn)都会(huì)提(tí)供有(yǒu)複制功能(néng),多(duō)試試右(yòu)鍵),一(yī)般都能(néng)找(zhǎo)到(dào)答(dá)案(àn)。

當然,搜索也(yě)有(yǒu)技巧。

Ø 去(qù)除掉“个(gè)性(xìng)词”,例如(rú)跟您電(diàn)腦名有(yǒu)關(guān)的(de)、您自(zì)己的(de)電(diàn)腦路(lù)徑、您自(zì)己的(de)文(wén)件(jiàn)名等。

Ø 錯誤提(tí)示很长时(shí),删減一(yī)些不(bù)必要(yào)的(de)語(yǔ)句(jù),保留關(guān)鍵词等。多(duō)試試不(bù)同(tóng)的(de)組合,万(wàn)一(yī)有(yǒu)人(rén)問(wèn)的(de)方(fāng)式不(bù)同(tóng)呢。

Ø 搜索时(shí),把软(ruǎn)件(jiàn)名带(dài)上(shàng),否則会(huì)搜索出(chū)很多(duō)非(fēi)本(běn)软(ruǎn)件(jiàn)的(de)問(wèn)題(tí)。

 

最(zuì)後(hòu),笔(bǐ)者(zhě)精心(xīn)整理并收(shōu)集了(le)多(duō)種(zhǒng)工具遇到(dào)的(de)問(wèn)題(tí),并整理成(chéng)一(yī)个(gè)帖子,读(dú)者(zhě)如(rú)果(guǒ)遇到(dào)软(ruǎn)件(jiàn)的(de)問(wèn)題(tí),可(kě)以(yǐ)先(xiān)從下(xià)面(miàn)找(zhǎo)找(zhǎo)答(dá)案(àn)。

QUARTUS問(wèn)題(tí)彙總(zǒng)贴:http://old.mdy-edu.com/plus/view.php?aid=1191

VIVADO問(wèn)題(tí)彙總(zǒng)贴:http://old.mdy-edu.com/wentijieda/20210409/1208.html

MODELSIM問(wèn)題(tí)彙總(zǒng)贴:http://old.mdy-edu.com/wentijieda/20210409/1215.html

在(zài)線(xiàn)調試工具問(wèn)題(tí)贴:http://old.mdy-edu.com/wentijieda/20210409/1217.html

GVIM問(wèn)題(tí)彙總(zǒng)贴:http://old.mdy-edu.com/wentijieda/20210409/1219.html

 

2.3 方(fāng)法2:咨詢

如(rú)果(guǒ)搜索不(bù)到(dào)答(dá)案(àn),读(dú)者(zhě)可(kě)以(yǐ)咨詢技術(shù)支持(chí)老(lǎo)师(shī)。老(lǎo)师(shī)们(men)会(huì)打(dǎ)包(bāo)好(hǎo)常用(yòng)的(de)软(ruǎn)件(jiàn)工具,提(tí)供下(xià)载路(lù)徑、使用(yòng)说(shuō)明(míng)和(hé)注意(yì)事(shì)項等。

 

第(dì)3节(jié) 語(yǔ)法編譯錯誤

語(yǔ)法編譯錯誤,是(shì)指不(bù)符合VERILOG/VHDL語(yǔ)法規則而(ér)引出(chū)的(de)錯誤,例如(rú)忘了(le)加分(fēn)号(hào),信(xìn)号(hào)未定(dìng)義等。

上(shàng)面(miàn)是(shì)MODELSIM提(tí)示的(de)錯誤,上(shàng)面(miàn)錯誤提(tí)示里(lǐ),指明(míng)了(le)代(dài)碼led_learn_tb.v文(wén)件(jiàn)的(de)第(dì)23行有(yǒu)問(wèn)題(tí),像这(zhè)種(zhǒng)指明(míng)了(le)哪份代(dài)碼的(de),一(yī)般就(jiù)是(shì)語(yǔ)法編譯錯誤。

語(yǔ)法編譯錯誤很覺見(jiàn),初学者(zhě)由(yóu)于(yú)不(bù)熟悉VERILOG,写出(chū)不(bù)符合語(yǔ)法規則的(de)代(dài)碼;而(ér)对(duì)于(yú)專業的(de)FPGA工程师(shī),也(yě)經(jīng)常会(huì)由(yóu)于(yú)粗(cū)心(xīn),或(huò)者(zhě)想(xiǎng)讓软(ruǎn)件(jiàn)幫忙檢查等原因(yīn),出(chū)現(xiàn)語(yǔ)法編譯錯誤。

出(chū)現(xiàn)問(wèn)題(tí)很正(zhèng)常,,根(gēn)據(jù)錯誤提(tí)示,打(dǎ)開(kāi)代(dài)碼文(wén)件(jiàn),定(dìng)位到(dào)那(nà)一(yī)行,去(qù)檢查就(jiù)是(shì)了(le)。

3.1 認識:软(ruǎn)件(jiàn)不(bù)会(huì)有(yǒu)毛(máo)病

首先(xiān)要(yào)樹(shù)立明(míng)确的(de)認識:软(ruǎn)件(jiàn)不(bù)会(huì)有(yǒu)毛(máo)病的(de)!

软(ruǎn)件(jiàn)指出(chū)某个(gè)代(dài)碼有(yǒu)問(wèn)題(tí)时(shí),那(nà)肯定(dìng)是(shì)代(dài)碼有(yǒu)問(wèn)題(tí),不(bù)用(yòng)怀疑!不(bù)要(yào)認为(wèi)自(zì)己遇到(dào)了(le)很“奇怪”、“不(bù)可(kě)能(néng)”的(de)情(qíng)況,软(ruǎn)件(jiàn)不(bù)会(huì)有(yǒu)毛(máo)病的(de),肯定(dìng)是(shì)代(dài)碼有(yǒu)問(wèn)題(tí)。

有(yǒu)部(bù)分(fēn)读(dú)者(zhě),一(yī)出(chū)問(wèn)題(tí),稍微檢查一(yī)下(xià),就(jiù)輕(qīng)易得出(chū)“奇怪”、“不(bù)可(kě)能(néng)”的(de)結論,滿心(xīn)欢喜地(dì)跟人(rén)分(fēn)享。比較盲目相信(xìn)自(zì)己的(de)代(dài)碼,不(bù)願意(yì)深入(rù)地(dì)檢查,有(yǒu)一(yī)種(zhǒng):代(dài)碼明(míng)明(míng)沒(méi)有(yǒu)問(wèn)題(tí),發(fà)現(xiàn)了(le)软(ruǎn)件(jiàn)有(yǒu)毛(máo)病的(de)心(xīn)态。

經(jīng)过(guò)多(duō)年(nián)的(de)实踐證明(míng),软(ruǎn)件(jiàn)不(bù)会(huì)出(chū)錯的(de),肯定(dìng)是(shì)自(zì)己代(dài)碼出(chū)問(wèn)題(tí)的(de)。支持(chí)这(zhè)个(gè)信(xìn)念,您才能(néng)毫(háo)无顧忌地(dì)深入(rù)檢查,一(yī)遍(biàn)沒(méi)檢查出(chū)来(lái),就(jiù)檢查两(liǎng)遍(biàn)。笔(bǐ)者(zhě)曾經(jīng)試过(guò)盯着某行代(dài)碼足足半小时(shí),突然間(jiān)才找(zhǎo)到(dào)問(wèn)題(tí)所(suǒ)在(zài)。

软(ruǎn)件(jiàn)提(tí)示錯誤了(le),那(nà)肯定(dìng)是(shì)有(yǒu)錯,但软(ruǎn)件(jiàn)的(de)提(tí)示也(yě)会(huì)存在(zài)誤導。它(tā)说(shuō)錯誤的(de)那(nà)一(yī)行,不(bù)一(yī)定(dìng)就(jiù)是(shì)这(zhè)一(yī)行出(chū)錯。它(tā)说(shuō)錯誤的(de)問(wèn)題(tí),不(bù)一(yī)定(dìng)是(shì)这(zhè)个(gè)問(wèn)題(tí),反(fǎn)而(ér)是(shì)其他(tā)問(wèn)題(tí)等。如(rú)说(shuō)前(qián)面(miàn)一(yī)行缺少(shǎo)了(le)一(yī)个(gè)逗(dòu)号(hào),一(yī)个(gè)分(fēn)号(hào)的(de)話(huà),软(ruǎn)件(jiàn)就(jiù)不(bù)会(huì)在(zài)这(zhè)一(yī)行提(tí)示,而(ér)是(shì)下(xià)一(yī)行提(tí)示。因(yīn)此(cǐ)檢查时(shí),要(yào)前(qián)前(qián)後(hòu)後(hòu)地(dì)檢查。

3.2 強(qiáng)烈推薦:代(dài)替法

对(duì)于(yú)不(bù)熟悉VERILOG語(yǔ)法的(de)读(dú)者(zhě),很担心(xīn)自(zì)己定(dìng)位不(bù)出(chū)語(yǔ)法問(wèn)題(tí)。其实定(dìng)位語(yǔ)法問(wèn)題(tí)非(fēi)常簡單,笔(bǐ)者(zhě)在(zài)此(cǐ)強(qiáng)烈推薦一(yī)種(zhǒng)定(dìng)位方(fāng)法:代(dài)替法。它(tā)可(kě)以(yǐ)在(zài)您不(bù)熟悉語(yǔ)法的(de)前(qián)提(tí)下(xià),找(zhǎo)到(dào)問(wèn)題(tí)所(suǒ)在(zài)。

定(dìng)位問(wèn)題(tí)其实就(jiù)是(shì)不(bù)斷地(dì)将問(wèn)題(tí)搜索範圍變(biàn)小,最(zuì)終(zhōng)定(dìng)位到(dào)某一(yī)行、某一(yī)个(gè)語(yǔ)法的(de)問(wèn)題(tí)。读(dú)者(zhě)首先(xiān)要(yào)知道(dào)VERILOG最(zuì)簡單的(de)語(yǔ)法,例如(rú)簡單的(de)modelsim結構、always結構和(hé)assign結構等。例如(rú)下(xià)面(miàn)的(de)代(dài)碼要(yào)有(yǒu)所(suǒ)了(le)解(jiě),这(zhè)是(shì)最(zuì)基本(běn)的(de)要(yào)求,如(rú)果(guǒ)不(bù)清(qīng)楚,拿本(běn)書(shū)去(qù)学学,也(yě)就(jiù)半小时(shí)的(de)事(shì)。

1

module test(

din    ,

flag_start

)

input   din          ;

output  flag_add_start ;

 

reg     flag_add;

always @ (posedge clk or negedge rst_n)begin

if(!rst_n) begin

flag_add <= 1'b0;

end

    else begin

flag_add <= din;

end

end

 

assign flag_start = flag_add ^din ;

 

endmodule

假設一(yī)个(gè)複雜的(de)代(dài)碼出(chū)現(xiàn)了(le)錯誤,例如(rú)下(xià)面(miàn)的(de)代(dài)碼,其使用(yòng)了(le)比較多(duō)的(de)語(yǔ)法,例如(rú)有(yǒu)位選符号(hào)[]、拼接符{},還(huán)出(chū)現(xiàn)了(le)未知的(de)data_width。假設软(ruǎn)件(jiàn)提(tí)示該代(dài)碼有(yǒu)問(wèn)題(tí),而(ér)您又看(kàn)不(bù)出(chū)哪里(lǐ)有(yǒu)問(wèn)題(tí)时(shí),您該如(rú)何定(dìng)位該問(wèn)題(tí)呢?(本(běn)例只(zhī)是(shì)假設有(yǒu)問(wèn)題(tí),不(bù)一(yī)定(dìng)是(shì)有(yǒu)問(wèn)題(tí))

1

always @ (posedge clk or negedge rst_n)begin

if(!rst_n) begin

        dout <= 0;

end

else if(spi_cs_ data_ reg2=0&&spi_cs_ data_ reg1==0)begin

if(spi_ up_ flag)begin

dout [data_ width-1:0]<={dout [data_ width-2:0],spi _sdi};

end

else begin

dout [data_ width-1:0]<=dout[data_ width-1:0]:

end

end

end

 

定(dìng)位的(de)思(sī)路(lù)是(shì)代(dài)替法,将複雜的(de)、您不(bù)知道(dào)的(de)語(yǔ)法,換成(chéng)您确定(dìng)的(de)、簡單的(de)語(yǔ)法,然後(hòu)編譯查看(kàn)提(tí)示,以(yǐ)确定(dìng)修改點(diǎn)是(shì)不(bù)是(shì)問(wèn)題(tí)所(suǒ)在(zài)。

您可(kě)以(yǐ)将上(shàng)面(miàn)複雜代(dài)碼,換成(chéng)下(xià)面(miàn)簡單代(dài)碼。如(rú)果(guǒ)編譯沒(méi)有(yǒu)出(chū)錯,那(nà)说(shuō)明(míng)錯誤一(yī)定(dìng)在(zài)原来(lái)的(de)ALWAYS处。如(rú)果(guǒ)編譯還(huán)是(shì)出(chū)錯,说(shuō)明(míng)錯誤在(zài)这(zhè)个(gè)ALWAYS之外(wài)。

1

always @ (posedge clk or negedge rst_n)begin

if(!rst_n) begin

        dout <= 0;

end

else begin

dout <= 1

end

end

假設編譯沒(méi)有(yǒu)錯誤,推理是(shì)这(zhè)个(gè)ALWAYS問(wèn)題(tí)。您可(kě)以(yǐ)在(zài)上(shàng)面(miàn)基礎上(shàng)補充稍複雜的(de)內(nèi)容,例如(rú)下(xià)面(miàn)情(qíng)況。

1

always @ (posedge clk or negedge rst_n)begin

if(!rst_n) begin

        dout <= 0;

end

else if(spi_cs_ data_ reg2=0&&spi_cs_ data_ reg1==0)begin

dout <= 1

end

end

如(rú)果(guǒ)編譯沒(méi)有(yǒu)錯誤,您可(kě)以(yǐ)再增加一(yī)些,例如(rú)把位選語(yǔ)法[]加上(shàng),例如(rú)下(xià)面(miàn)代(dài)碼。

1

always @ (posedge clk or negedge rst_n)begin

if(!rst_n) begin

        dout <= 0;

end

else if(spi_cs_ data_ reg2=0&&spi_cs_ data_ reg1==0)begin

if(spi_ up_ flag)begin

dout [data_ width-1:0]<=1;

end

else begin

dout [data_ width-1:0]<=0:

end

end

end

 

如(rú)果(guǒ)有(yǒu)編譯錯誤,说(shuō)明(míng)增加的(de)部(bù)分(fēn)有(yǒu)問(wèn)題(tí);如(rú)果(guǒ)沒(méi)有(yǒu)錯誤,就(jiù)说(shuō)明(míng)錯誤還(huán)在(zài)其他(tā)地(dì)方(fāng)。

按此(cǐ)方(fāng)法繼續補充內(nèi)容,直(zhí)至(zhì)将所(suǒ)有(yǒu)內(nèi)容填完,總(zǒng)之一(yī)定(dìng)能(néng)找(zhǎo)出(chū)問(wèn)題(tí)所(suǒ)在(zài)。

假設定(dìng)位到(dào)是(shì)拼接符{}有(yǒu)問(wèn)題(tí)。此(cǐ)时(shí)完全(quán)可(kě)以(yǐ)搜索“verilog 拼接符”,学習相關(guān)內(nèi)容,進(jìn)而(ér)掌握正(zhèng)确的(de)使用(yòng)方(fāng)法。

代(dài)替法是(shì)一(yī)種(zhǒng)万(wàn)試万(wàn)靈的(de)方(fāng)法,只(zhī)要(yào)不(bù)斷去(qù)实踐和(hé)嘗試,就(jiù)肯定(dìng)能(néng)找(zhǎo)到(dào)問(wèn)題(tí)所(suǒ)的(de),強(qiáng)烈推薦大家(jiā)使用(yòng)。

 

3.3 找(zhǎo)不(bù)到(dào)XXX的(de)問(wèn)題(tí)

如(rú)果(guǒ)遇到(dào)找(zhǎo)不(bù)到(dào)xxx,沒(méi)有(yǒu)xxx这(zhè)類(lèi)問(wèn)題(tí),例如(rú)上(shàng)图(tú),MODELSIM提(tí)示,找(zhǎo)不(bù)到(dào)“model_name”。

遇到(dào)这(zhè)類(lèi)問(wèn)題(tí),一(yī)定(dìng)要(yào)清(qīng)楚QUARTUSMODELSIMVIVDADO的(de)流程,以(yǐ)及(jí)软(ruǎn)件(jiàn)工具與(yǔ)代(dài)碼、代(dài)碼與(yǔ)代(dài)碼之間(jiān)是(shì)如(rú)何關(guān)聯起来(lái)的(de)。

首先(xiān)是(shì)确認软(ruǎn)件(jiàn)工具和(hé)代(dài)碼文(wén)件(jiàn)的(de)關(guān)聯方(fāng)法。每个(gè)软(ruǎn)件(jiàn)如(rú)QUARTUSMODELSIM和(hé)VIVADO,都需要(yào)将代(dài)碼添加進(jìn)来(lái),即添加文(wén)件(jiàn)的(de)操作。添加後(hòu)的(de)文(wén)件(jiàn),就(jiù)将软(ruǎn)件(jiàn)工具和(hé)代(dài)碼文(wén)件(jiàn)聯系(xì)起来(lái)了(le)。注意(yì)的(de)是(shì),这(zhè)里(lǐ)關(guān)聯的(de)是(shì)“代(dài)碼文(wén)件(jiàn)”,而(ér)非(fēi)“模块(kuài)名”,有(yǒu)些代(dài)碼,其代(dài)碼文(wén)件(jiàn)名與(yǔ)模块(kuài)名是(shì)不(bù)一(yī)致(zhì)的(de)。

其次(cì)是(shì)确認文(wén)件(jiàn)名和(hé)模块(kuài)的(de)關(guān)聯。软(ruǎn)件(jiàn)工具会(huì)对(duì)關(guān)聯的(de)“代(dài)碼文(wén)件(jiàn)”進(jìn)行編譯,編譯後(hòu)会(huì)産生(shēng)可(kě)供使用(yòng)的(de)“模块(kuài)”,該模块(kuài)是(shì)以(yǐ)“模块(kuài)名”来(lái)命名的(de),即module name,而(ér)不(bù)是(shì)文(wén)件(jiàn)名。例如(rú)文(wén)件(jiàn)名为(wèi)a.v,而(ér)里(lǐ)面(miàn)的(de)模块(kuài)名是(shì)module b,則会(huì)生(shēng)成(chéng)模块(kuài)b。還(huán)要(yào)注意(yì),一(yī)个(gè)文(wén)件(jiàn)可(kě)以(yǐ)包(bāo)含多(duō)个(gè)模块(kuài),对(duì)該文(wén)件(jiàn)編譯,会(huì)生(shēng)成(chéng)多(duō)个(gè)模块(kuài)。如(rú)果(guǒ)找(zhǎo)不(bù)到(dào)模块(kuài),不(bù)要(yào)只(zhī)檢查文(wén)件(jiàn)名,還(huán)要(yào)看(kàn)模块(kuài)名,要(yào)檢查文(wén)件(jiàn)名和(hé)模块(kuài)名是(shì)不(bù)是(shì)一(yī)致(zhì)。

最(zuì)後(hòu)是(shì)确認模块(kuài)與(yǔ)模块(kuài)之間(jiān)的(de)關(guān)聯。每个(gè)软(ruǎn)件(jiàn)都会(huì)要(yào)求設置一(yī)个(gè)頂层模块(kuài),QUARTUS和(hé)VIVADO的(de)頂层模块(kuài),就(jiù)是(shì)設計(jì)的(de)頂层文(wén)件(jiàn);MODELSIM的(de)頂层文(wén)件(jiàn)是(shì)测試文(wén)件(jiàn)。設置了(le)頂层文(wén)件(jiàn)後(hòu),软(ruǎn)件(jiàn)工具会(huì)從頂层文(wén)件(jiàn)開(kāi)始,逐級找(zhǎo)到(dào)其他(tā)模块(kuài),線(xiàn)索就(jiù)是(shì)例化(huà)。例如(rú)設置了(le)頂层模块(kuài)为(wèi)模块(kuài)a;模块(kuài)a例化(huà)了(le)模块(kuài)b和(hé)模块(kuài)c;模块(kuài)b例化(huà)了(le)模块(kuài)d和(hé)e。那(nà)麼(me)软(ruǎn)件(jiàn)工具首先(xiān)找(zhǎo)到(dào)頂层模块(kuài)a;根(gēn)據(jù)例化(huà),找(zhǎo)到(dào)模块(kuài)b和(hé)模块(kuài)c;根(gēn)據(jù)模块(kuài)b找(zhǎo)到(dào)模块(kuài)d和(hé)e。通(tòng)过(guò)这(zhè)種(zhǒng)方(fāng)法,就(jiù)把所(suǒ)有(yǒu)使用(yòng)到(dào)的(de)模块(kuài)關(guān)聯起来(lái)了(le)。

需要(yào)注意(yì)的(de)是(shì),某些模块(kuài)是(shì)官方(fāng)自(zì)带(dài)的(de),例如(rú)VIVADO的(de)原語(yǔ)、XMP等,以(yǐ)及(jí)某些IP核調用(yòng)的(de)庫。这(zhè)些模块(kuài)在(zài)官方(fāng)软(ruǎn)件(jiàn)使用(yòng)时(shí),不(bù)需要(yào)添加到(dào)工程,官方(fāng)软(ruǎn)件(jiàn)是(shì)能(néng)够自(zì)動(dòng)識别的(de)。但这(zhè)些模块(kuài)在(zài)第(dì)三(sān)方(fāng)软(ruǎn)件(jiàn)例如(rú)MODELSIM使用(yòng)时(shí),MODELSIM是(shì)不(bù)清(qīng)楚这(zhè)些模块(kuài)的(de),那(nà)麼(me)就(jiù)要(yào)添加这(zhè)些仿真(zhēn)庫,把这(zhè)些模块(kuài)的(de)文(wén)件(jiàn)添加進(jìn)来(lái),從而(ér)讓MODELSIM能(néng)識别。當發(fà)現(xiàn)某模块(kuài)找(zhǎo)不(bù)到(dào)时(shí),要(yào)辨别該模块(kuài)是(shì)在(zài)哪个(gè)文(wén)件(jiàn)中(zhōng)被(bèi)調用(yòng)了(le),是(shì)不(bù)是(shì)被(bèi)IP核調用(yòng)的(de),如(rú)果(guǒ)答(dá)案(àn)是(shì)肯定(dìng)的(de)話(huà),那(nà)就(jiù)要(yào)注意(yì)软(ruǎn)件(jiàn)是(shì)否缺少(shǎo)庫的(de)問(wèn)題(tí)了(le)。

綜上(shàng),當提(tí)示某模块(kuài)找(zhǎo)不(bù)到(dào)的(de)时(shí)候,檢查代(dài)碼文(wén)件(jiàn)有(yǒu)沒(méi)有(yǒu)加到(dào)工程;檢查文(wén)件(jiàn)名和(hé)模块(kuài)名是(shì)否一(yī)致(zhì);檢查是(shì)否IP核調用(yòng)了(le)該模块(kuài),是(shì)的(de)話(huà)添加庫文(wén)件(jiàn)等。

 

第(dì)4节(jié) 功能(néng)錯誤

功能(néng)錯誤,是(shì)指不(bù)符合設計(jì)目标(biāo),與(yǔ)預期(qī)不(bù)一(yī)致(zhì)的(de)錯誤。

软(ruǎn)件(jiàn)是(shì)順序串行的(de),是(shì)按照代(dài)碼的(de)順序,一(yī)步一(yī)步執行的(de),使用(yòng)斷點(diǎn)、打(dǎ)印(yìn)LOG等方(fāng)法,順序去(qù)檢查每步的(de)執行結果(guǒ),就(jiù)能(néng)找(zhǎo)到(dào)問(wèn)題(tí),因(yīn)此(cǐ)定(dìng)位起来(lái)非(fēi)常簡單。

而(ér)FPGA代(dài)碼是(shì)并行的(de),意(yì)味着在(zài)同(tóng)一(yī)时(shí)刻,多(duō)个(gè)ALWAYS同(tóng)时(shí)執行,您需要(yào)檢查每时(shí)每刻所(suǒ)有(yǒu)的(de)信(xìn)号(hào)的(de)正(zhèng)确性(xìng),如(rú)何從衆多(duō)的(de)信(xìn)号(hào)(幾(jǐ)千(qiān)幾(jǐ)万(wàn)幾(jǐ)十(shí)万(wàn)个(gè)信(xìn)号(hào))、以(yǐ)及(jí)衆多(duō)的(de)时(shí)鐘(zhōng)周期(qī)中(zhōng),發(fà)現(xiàn)那(nà)个(gè)出(chū)現(xiàn)錯誤的(de)时(shí)刻以(yǐ)及(jí)信(xìn)号(hào),非(fēi)常有(yǒu)挑戰性(xìng)。

正(zhèng)是(shì)上(shàng)面(miàn)所(suǒ)说(shuō)的(de)差异(yì),FPGA的(de)定(dìng)位錯誤的(de)方(fāng)法完全(quán)不(bù)同(tóng)于(yú)软(ruǎn)件(jiàn)。FPGA更(gèng)加考验(yàn)工程师(shī)的(de)细(xì)心(xīn)程度(dù)。

 

4.1 認識1:放(fàng)稳心(xīn)态

首先(xiān)要(yào)認識到(dào),出(chū)現(xiàn)邏輯錯誤是(shì)很正(zhèng)常的(de),沒(méi)有(yǒu)验(yàn)證过(guò)的(de)代(dài)碼,一(yī)定(dìng)是(shì)有(yǒu)問(wèn)題(tí)的(de)代(dài)碼。写完代(dài)碼,仿真(zhēn)验(yàn)證,發(fà)現(xiàn)問(wèn)題(tí)修改;再次(cì)仿真(zhēn)验(yàn)證,这(zhè)是(shì)FPGA工程师(shī)的(de)日(rì)常工作。

定(dìng)位問(wèn)題(tí)解(jiě)決問(wèn)題(tí)是(shì)正(zhèng)常工作,要(yào)放(fàng)稳心(xīn)态,不(bù)要(yào)着急。那(nà)種(zhǒng)以(yǐ)为(wèi)一(yī)写代(dài)碼就(jiù)邏輯正(zhèng)确的(de)情(qíng)況,是(shì)不(bù)存在(zài)的(de)。

4.2 認識2:粗(cū)心(xīn)大意(yì)

其次(cì)我(wǒ)们(men)要(yào)樹(shù)立一(yī)个(gè)認識,软(ruǎn)件(jiàn)是(shì)不(bù)会(huì)有(yǒu)毛(máo)病的(de),一(yī)定(dìng)是(shì)自(zì)己代(dài)碼問(wèn)題(tí);如(rú)果(guǒ)沒(méi)找(zhǎo)到(dào)問(wèn)題(tí),那(nà)肯定(dìng)是(shì)不(bù)够细(xì)心(xīn);還(huán)沒(méi)找(zhǎo)到(dào),那(nà)就(jiù)要(yào)更(gèng)细(xì)心(xīn)再找(zhǎo)!

總(zǒng)之,沒(méi)找(zhǎo)到(dào)問(wèn)題(tí),就(jiù)更(gèng)加细(xì)心(xīn)就(jiù)对(duì)了(le)!

4.3 認識3:自(zì)己行動(dòng)

除非(fēi)有(yǒu)好(hǎo)心(xīn)人(rén),願意(yì)犧牲时(shí)間(jiān)来(lái)幫您遠(yuǎn)程定(dìng)位,否則邏輯功能(néng)錯誤是(shì)沒(méi)辦(bàn)法求助的(de)。在(zài)不(bù)熟知您代(dài)碼、不(bù)清(qīng)楚設計(jì)信(xìn)号(hào)的(de)含義、不(bù)知道(dào)設計(jì)意(yì)图(tú)时(shí),沒(méi)有(yǒu)人(rén)能(néng)够一(yī)眼(yǎn)看(kàn)出(chū)問(wèn)題(tí)所(suǒ)在(zài),即使是(shì)老(lǎo)师(shī)也(yě)不(bù)行。这(zhè)个(gè)問(wèn)題(tí)只(zhī)能(néng)靠工程师(shī)自(zì)己去(qù)定(dìng)位去(qù)解(jiě)決。

 

 

下(xià)一(yī)篇(piān)文(wén)章(zhāng),我(wǒ)们(men)将介紹定(dìng)位功能(néng)邏輯錯誤的(de)方(fāng)法,欢迎關(guān)注。


温(wēn)馨提(tí)示:明(míng)德揚除了(le)培訓学習還(huán)有(yǒu)項目承接業务,擅长的(de)項目主(zhǔ)要(yào)包(bāo)括的(de)方(fāng)向(xiàng)有(yǒu)以(yǐ)下(xià)幾(jǐ)个(gè)方(fāng)面(miàn):


1. MIPI視頻拼接


2. SLVS-EC轉(zhuǎn)MIPI接口(kǒu)(IMX472 IMX492)

3. PCIE采集系(xì)統

4. 图(tú)像項目

5. 高(gāo)速多(duō)通(tòng)道(dào)ADDA系(xì)統

6. 基于(yú)FPGA板卡(kǎ)研發(fà)

7. 前(qián)端模拟采集、射頻、電(diàn)荷靈敏前(qián)置放(fàng)大器


需要(yào)了(le)解(jiě)相關(guān)信(xìn)息可(kě)以(yǐ)聯系(xì)江老(lǎo)师(shī)18022859964(微信(xìn)同(tóng)号(hào))
明(míng)德揚科技教育


   拓展(zhǎn)閱读(dú)
⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨