• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

SOC中通过uart打印出代码的规则

学过C语言都知道,在程序中添加打印信息有助于我们追踪程序执行的情况。特别是debug的时候,打印一些log信息对快速定位到问题非常有帮助。
怎么在SOC验证的C代码中打印字符串呢?
如何实现打印?
两个思路,第一个思路,在SOC的TB里面增加一个CPU bus的monitor,我们在monitor中实现一个功能,当看到特定地址,特定数据的时候,开始收集要打印的字符串,当看到特定地址,另外一个特定数据的时候,结束字符串的收集,并将收集到字符串打印。
下面介绍一种更加普遍的使用方法。我们在嵌入式硬件开发的过程中经常用到串口调试工具。
因此在我们SOC验证环境中集成UART的slave device,在UART device收到数据后,打印出字符串信息是一个很好的选择。
为此,我们通过向uart device写字符串的形式,然后在UART device中实现打印功能。
下面是使用第一种方法实现的部分代码;

string sec_print_string;
function void write_ap(axitrans item);
  if(!$cast(sec_item, item))
    `uvm_fatal(get_type_name(), "failed to cast")
  if((sec_item.getDirection()=== WRITE) && (sec_itme.getAddress() === 'h0403))
    string core_type = "r5f";
    byte data0 = sec_item.Data[0];
    byte data1 = sec_item.Data[1];
    if(data1 === 8'h00) begin
      if(data0 === 8'h06) begin  //ACK
        ->sec_event_e;
        `uvm_info(get_type_name(), $sformatf("%s test pass", core_type), UVM_NONE)
      end
      else if(data0 === 8'h15) begin  //NAK  
        ->sec_event_e;
        `uvm_info(get_type_name(), $sformatf("%s test fail", core_type), UVM_NONE)
      end 
      else if(data0 === 8'0a) begin  //line front
        `uvm_info(get_type_name(), $sformatf("message:{%s} %s", core_type, sec_print_string), UVM_NONE)
        sec_print_string = "";
      end
      else begin
        sec_print_string = {sec_print_string, data0};
      end
    end
endfunction: wirte_ap

posted on 2023-10-12 22:12  SOC验证工程师  阅读(185)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3