怎么在SOC验证的C代码中打印字符串呢?用printf?

学过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中打印字符串信息。
如何实现打印?
两个思路,第一个思路,在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中实现字符串打印了吧。


无线路由器的标称速度套路
原来电影里的特效是这么来的!如何让烟像水流一样流动?
高兼容性Wi-Fi模块 创新微MinewSemi赋予客户新能量
无线传输距离计算公式
升压恒流FP7209船舶灯,摄影灯应用,扛干扰过EMI认证原理图
怎么在SOC验证的C代码中打印字符串呢?用printf?
无人机航拍的这些奇葩建筑你都见过吗?
变频器如何使电机加速或者减速
20多家半导体企业宣布从新三板退市,原因曝光!
300W高效环保AC/DC砖类电源——LBH300-13Bxx系列
国家电网启动智能电网机器人独立进行带电作业,提供可靠电力保障
通过植入式无线生物传感器来监测脑血流
scale-2芯片组的特性特点及应用分析
如何使用普通的CAT5网络电缆制作15m长的VGA电缆
关于TI设计工业机器人技术实现 CPU 板的不同子系统的解决方案
传华为Mate9升级快充技术 搭载双摄像头和麒麟960
无线ap与无线路由器有什么不同,它的优势又在哪里
重复式定时电路
新式滑环对比传统滑环,它的优势是什么
每日一课 | 智慧灯杆建设落地的关键因素——运营模式是内驱