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
浙公网安备 33010602011771号