學(xué)過(guò)C語(yǔ)言都知道,在程序中添加打印信息有助于我們追蹤程序執(zhí)行的情況。特別是debug的時(shí)候,打印一些log信息對(duì)快速定位到問(wèn)題非常有幫助。
怎么在SOC驗(yàn)證的C代碼中打印字符串呢?用printf ?
我們來(lái)試一下:
執(zhí)行結(jié)果:
沒(méi)有出現(xiàn) Hello world。這種結(jié)果是符合預(yù)期的。C code 通過(guò)GCC編譯生成bin文件然后送到CPU中按指令進(jìn)行執(zhí)行。我們看下這段代碼編譯出來(lái)的指令是什么?
這里 printf 編譯出來(lái)是jump到一個(gè)puts的函數(shù)里面。puts函數(shù)又是什么呢?
puts 又跳到 _puts_r ,依次下去,由printf 編譯出了一系列的指令代碼。由于CPU最終綜合成版圖,因此在CPU的RTL代碼中不會(huì)存在讀到某條指令打印一個(gè)字符串的功能。所以單純的調(diào)用printf 并不會(huì)在log中打印字符串信息。
如何實(shí)現(xiàn)打印?
兩個(gè)思路,第一個(gè)思路,在SOC的TB里面增加一個(gè)CPU bus的monitor,我們?cè)趍onitor中實(shí)現(xiàn)一個(gè)功能,當(dāng)看到特定地址,特定數(shù)據(jù)的時(shí)候,開(kāi)始收集要打印的字符串,當(dāng)看到特定地址,另外一個(gè)特定數(shù)據(jù)的時(shí)候,結(jié)束字符串的收集,并將收集到字符串打印。
以下是我們?cè)谝粋€(gè)project中看到特殊數(shù)據(jù) 24’hdddd_11xx 開(kāi)始收集字符串。
以下是我們?cè)谝粋€(gè)project中看到特殊數(shù)據(jù)24’hdddd_eeee 時(shí)打印字符串。
這樣,我們可以在c里面實(shí)現(xiàn)一個(gè)打印字符串的函數(shù)。
通過(guò)上面這種手段,我們巧妙的將C語(yǔ)言的打印和 verilog的$display 打印連接起來(lái)。我們來(lái)看看效果
Hello World 打印出來(lái)了。
我們?cè)倏纯?puts編譯后的代碼是什么?
這次 puts并沒(méi)有跳轉(zhuǎn)到_puts_r ,而是向特定地址發(fā)送特定數(shù)據(jù)表示開(kāi)始,然后傳輸字符串,并以特定數(shù)據(jù)結(jié)束。當(dāng)我們的monitor檢查到這些特殊的數(shù)據(jù)時(shí)就會(huì)打印出log信息。
上面打印的方式可以解決在SOC驗(yàn)證環(huán)境中打印字符串的問(wèn)題,但是在芯片流片回來(lái)之后,在C中調(diào)用上述函數(shù)還能打印嗎?顯然是不可以的,因?yàn)檫@個(gè)時(shí)候外部的monitor都沒(méi)有了,更別說(shuō)不能綜合的display函數(shù)等。
下面介紹一種更加普遍的使用方法。我們?cè)?a href="http://www.ttokpm.com/soft/data/21-22/" target="_blank">嵌入式硬件開(kāi)發(fā)的過(guò)程中經(jīng)常用到串口調(diào)試工具。
通過(guò)簡(jiǎn)單的幾根線與電腦連接,然后用串口調(diào)試助手就能將SOC和電腦調(diào)試界面連接起來(lái)。
因此在我們SOC驗(yàn)證環(huán)境中集成UART的slave device,在UART device收到數(shù)據(jù)后,打印出字符串信息是一個(gè)很好的選擇。
為此,我們通過(guò)向uart device寫字符串的形式,然后在UART device中實(shí)現(xiàn)打印功能。
我們來(lái)測(cè)試下用上面這種方式打印的效果,prints 是我們向uart 發(fā)送字符串的函數(shù)。
下面是執(zhí)行效果
同樣實(shí)現(xiàn)了打印,而且這種打印方式在后續(xù)芯片流片回來(lái)之后可以通過(guò)串口調(diào)試 查看打印的信息。
看到這里,大家明白怎么在SOC中實(shí)現(xiàn)字符串打印了吧。
審核編輯:劉清
-
SoC設(shè)計(jì)
+關(guān)注
關(guān)注
1文章
147瀏覽量
18718 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7575瀏覽量
134152 -
gcc編譯器
+關(guān)注
關(guān)注
0文章
78瀏覽量
3297 -
Printf
+關(guān)注
關(guān)注
0文章
81瀏覽量
13564
原文標(biāo)題:SOC驗(yàn)證C代碼中如何打印字符串?
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論