0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

sanyue7758 来源:处芯积律 2023-04-21 09:33 次阅读

学过C语言都知道,在程序中添加打印信息有助于我们追踪程序执行的情况。特别是debug的时候,打印一些log信息对快速定位到问题非常有帮助。

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

我们来试一下:

c1820eda-dfcc-11ed-bfe3-dac502259ad0.png

执行结果:

c1971672-dfcc-11ed-bfe3-dac502259ad0.png

没有出现 Hello world。这种结果是符合预期的。C code 通过GCC编译生成bin文件然后送到CPU中按指令进行执行。我们看下这段代码编译出来的指令是什么?

c1a8bc7e-dfcc-11ed-bfe3-dac502259ad0.png

这里 printf 编译出来是jump到一个puts的函数里面。puts函数又是什么呢?

c1c1ba80-dfcc-11ed-bfe3-dac502259ad0.png

puts 又跳到 _puts_r ,依次下去,由printf 编译出了一系列的指令代码。由于CPU最终综合成版图,因此在CPU的RTL代码中不会存在读到某条指令打印一个字符串的功能。所以单纯的调用printf 并不会在log中打印字符串信息。

如何实现打印?

两个思路,第一个思路,在SOC的TB里面增加一个CPU bus的monitor,我们在monitor中实现一个功能,当看到特定地址,特定数据的时候,开始收集要打印的字符串,当看到特定地址,另外一个特定数据的时候,结束字符串的收集,并将收集到字符串打印。

以下是我们在一个project中看到特殊数据 24’hdddd_11xx 开始收集字符串。

c1d336b6-dfcc-11ed-bfe3-dac502259ad0.png

以下是我们在一个project中看到特殊数据24’hdddd_eeee 时打印字符串。

c1e7ec1e-dfcc-11ed-bfe3-dac502259ad0.png

这样,我们可以在c里面实现一个打印字符串的函数。

c1fb4d72-dfcc-11ed-bfe3-dac502259ad0.png

通过上面这种手段,我们巧妙的将C语言的打印和 verilog的$display 打印连接起来。我们来看看效果

c20e3a18-dfcc-11ed-bfe3-dac502259ad0.png

Hello World 打印出来了。

我们再看看 puts编译后的代码是什么?

c21ff974-dfcc-11ed-bfe3-dac502259ad0.png

这次 puts并没有跳转到_puts_r ,而是向特定地址发送特定数据表示开始,然后传输字符串,并以特定数据结束。当我们的monitor检查到这些特殊的数据时就会打印出log信息。

上面打印的方式可以解决在SOC验证环境中打印字符串的问题,但是在芯片流片回来之后,在C中调用上述函数还能打印吗?显然是不可以的,因为这个时候外部的monitor都没有了,更别说不能综合的display函数等。

下面介绍一种更加普遍的使用方法。我们在嵌入式硬件开发的过程中经常用到串口调试工具。

通过简单的几根线与电脑连接,然后用串口调试助手就能将SOC和电脑调试界面连接起来。

c2742fda-dfcc-11ed-bfe3-dac502259ad0.png

因此在我们SOC验证环境中集成UART的slave device,在UART device收到数据后,打印出字符串信息是一个很好的选择。

为此,我们通过向uart device写字符串的形式,然后在UART device中实现打印功能。

c2941a48-dfcc-11ed-bfe3-dac502259ad0.png

我们来测试下用上面这种方式打印的效果,prints 是我们向uart 发送字符串的函数。

c2a9c6ae-dfcc-11ed-bfe3-dac502259ad0.png

下面是执行效果

c2bc2b0a-dfcc-11ed-bfe3-dac502259ad0.png

同样实现了打印,而且这种打印方式在后续芯片流片回来之后可以通过串口调试 查看打印的信息。

看到这里,大家明白怎么在SOC中实现字符串打印了吧。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SoC设计
    +关注

    关注

    1

    文章

    148

    浏览量

    18774
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136797
  • gcc编译器
    +关注

    关注

    0

    文章

    78

    浏览量

    3382
  • Printf
    +关注

    关注

    0

    文章

    83

    浏览量

    13657

原文标题:SOC验证C代码中如何打印字符串?

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C++字符串string

    string是C++编程语言中的字符串C++字符串处理可以使用
    的头像 发表于 07-10 00:26 1288次阅读
    <b class='flag-5'>C</b>++<b class='flag-5'>字符串</b>string

    rtt studio终端无法打印字符串是怎么回事?

    求助:rtt studio新创建的项目使用自带终端可以打印字符串,但是将字符串输出语句注释掉再改回来终端就无法打印了,并且msh也未显示也无法使用输入,使用其他的串口调试助手看到了rtt的界面以及
    发表于 07-05 07:29

    想实现字符串a复制到b,然后打印字符串b,程序错在哪...

    想实现字符串a复制到b,然后打印字符串b,程序错在哪!!!
    发表于 12-22 21:11

    c语言中如何把字符串的ASCII码通过printf函数打印字符串

    printf_cpsr: %scpsr= 0x%x \n\r",why,cpsr);}参数cpsr可以正常打印出来,但是why值就是字母usr始终无法正确显示,请问问大家这该怎么处理printf函数
    发表于 01-22 23:16

    如何通过蓝牙设备串行打印字符串

    如何通过蓝牙设备串行打印字符串,只有UARTPTCHAR选项。条件-我正在通过UART向蓝牙设备发送一个单词。同时,我希望从蓝牙设备接收一个连续的字符串[大小n],而不会中断传输数据。我PSUC上
    发表于 10-09 09:13

    怎样将stm32口格式化打印字符串的函数进行封装

    怎样将stm32口格式化打印字符串的函数进行封装
    发表于 11-26 06:38

    怎样printf()函数实现通过串口打印信息

    怎样printf()函数实现通过串口打印信息?如何实现printf()函数打印字符串重定义到
    发表于 11-30 07:27

    怎样使用printf函数将字符串打印到串口

    怎样使用printf函数将字符串打印到串口?怎样去重新定向printf函数
    发表于 02-24 06:50

    C语言入门教程-字符串须知

    字符串须知 关于字符串常量假设您编写并运行下面两段代码printf("%s ",s);} Fragment 2 {char s[100];strcpy(s,"hello
    发表于 07-29 14:19 1166次阅读

    strings命令:用于打印文件打印字符串

      1.命令简介 strings 命令是二进制工具集 GNU Binutils 的一员,用于打印文件打印字符串,文件可以是文本文件(test.c),但一般用于
    的头像 发表于 02-02 13:53 3028次阅读
    strings命令:用于<b class='flag-5'>打印</b>文件<b class='flag-5'>中</b>可<b class='flag-5'>打印字符串</b>

    如何使用printf函数将字符串打印到串口

    如何使用printf函数将字符串打印到串口该函数名已经标准输入输出库头文 件 stdio.h 定义,原型为 int fputc(int
    发表于 01-12 18:53 1次下载
    如何使用<b class='flag-5'>printf</b>函数将<b class='flag-5'>字符串</b><b class='flag-5'>打印</b>到串口

    C语言总结_字符串函数封装练习

    字符串函数重写练习:字符串比较、字符串拼接、字符串查找、字符串拷贝、内存比较、内存拷贝、内存初始化、内存比较、二维数组定义及基本使用、位运算
    的头像 发表于 08-14 09:42 1000次阅读

    C语言字符串的引用方式

    C语言程序字符串是存放在字符数组的。 2. 用字符
    的头像 发表于 03-10 14:57 1936次阅读

    c语言字符串定义

    C语言是一种强大而广泛使用的编程语言,字符串是其中一个非常重要的概念。C语言中,字符串是由一系列字符
    的头像 发表于 11-24 10:02 1951次阅读

    c语言怎么scanf输入字符串

    C语言中,我们可以使用scanf函数来接收用户的输入。scanf函数有很多种用法,其中一种用法就是用来接收字符串。 要接收字符串,我们可以使用"%s"格式说明符。下面是一个简单的示例
    的头像 发表于 11-24 10:03 2721次阅读