學過C語言都知道,在程序中添加打印信息有助于我們追蹤程序執行的情況。特別是debug的時候,打印一些log信息對快速定位到問題非常有幫助。
怎么在SOC驗證的C代碼中打印字符串呢?用printf ?
我們來試一下:
執行結果:
沒有出現 Hello world。這種結果是符合預期的。C code 通過GCC編譯生成bin文件然后送到CPU中按指令進行執行。我們看下這段代碼編譯出來的指令是什么?
這里 printf 編譯出來是jump到一個puts的函數里面。puts函數又是什么呢?
puts 又跳到 _puts_r ,依次下去,由printf 編譯出了一系列的指令代碼。由于CPU最終綜合成版圖,因此在CPU的RTL代碼中不會存在讀到某條指令打印一個字符串的功能。所以單純的調用printf 并不會在log中打印字符串信息。
如何實現打?。?/p>
兩個思路,第一個思路,在SOC的TB里面增加一個CPU bus的monitor,我們在monitor中實現一個功能,當看到特定地址,特定數據的時候,開始收集要打印的字符串,當看到特定地址,另外一個特定數據的時候,結束字符串的收集,并將收集到字符串打印。
以下是我們在一個project中看到特殊數據 24’hdddd_11xx 開始收集字符串。
以下是我們在一個project中看到特殊數據24’hdddd_eeee 時打印字符串。
這樣,我們可以在c里面實現一個打印字符串的函數。
通過上面這種手段,我們巧妙的將C語言的打印和 verilog的$display 打印連接起來。我們來看看效果
Hello World 打印出來了。
我們再看看 puts編譯后的代碼是什么?
這次 puts并沒有跳轉到_puts_r ,而是向特定地址發送特定數據表示開始,然后傳輸字符串,并以特定數據結束。當我們的monitor檢查到這些特殊的數據時就會打印出log信息。
上面打印的方式可以解決在SOC驗證環境中打印字符串的問題,但是在芯片流片回來之后,在C中調用上述函數還能打印嗎?顯然是不可以的,因為這個時候外部的monitor都沒有了,更別說不能綜合的display函數等。
下面介紹一種更加普遍的使用方法。我們在嵌入式硬件開發的過程中經常用到串口調試工具。
通過簡單的幾根線與電腦連接,然后用串口調試助手就能將SOC和電腦調試界面連接起來。
因此在我們SOC驗證環境中集成UART的slave device,在UART device收到數據后,打印出字符串信息是一個很好的選擇。
為此,我們通過向uart device寫字符串的形式,然后在UART device中實現打印功能。
我們來測試下用上面這種方式打印的效果,prints 是我們向uart 發送字符串的函數。
下面是執行效果
同樣實現了打印,而且這種打印方式在后續芯片流片回來之后可以通過串口調試 查看打印的信息。
看到這里,大家明白怎么在SOC中實現字符串打印了吧。
審核編輯:劉清
-
SoC設計
+關注
關注
1文章
151瀏覽量
19111 -
C語言
+關注
關注
180文章
7630瀏覽量
140560 -
gcc編譯器
+關注
關注
0文章
78瀏覽量
3670 -
Printf
+關注
關注
0文章
84瀏覽量
14131
原文標題:SOC驗證C代碼中如何打印字符串?
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
rtt studio終端無法打印字符串是怎么回事?
想實現字符串a復制到b中,然后打印字符串b,程序錯在哪...
c語言中如何把字符串的ASCII碼通過printf函數打印字符串
如何通過藍牙設備串行打印字符串?
C語言入門教程-字符串須知
strings命令:用于打印文件中可打印字符串

如何使用printf函數將字符串打印到串口

評論