免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

Ccase和UVMTB的交互,tube-創(chuàng)新互聯(lián)

C代碼調(diào)用printf時,打印信息顯示在哪個IO上,由pringf調(diào)用的底層代碼決定;軟件C中的printf默認在terminal上打印;對于嵌入式C, 運行在開發(fā)板上的code,可以借助target自己的顯示IO,如LCD屏,將打印信息直接顯示在LCD屏上;如果target沒有顯示IO,也可以retarget到host端的terminal上;simulation仿真時,運行的C代碼需要借助主機host的IO,將打印信息顯示在simulation terminal上;常見的方式有以下幾種:

創(chuàng)新互聯(lián)建站電話聯(lián)系:028-86922220,為您提供成都網(wǎng)站建設網(wǎng)頁設計及定制高端網(wǎng)站建設服務,創(chuàng)新互聯(lián)建站網(wǎng)頁制作領域十余年,包括成都格柵板等多個行業(yè)擁有豐富的網(wǎng)站營銷經(jīng)驗,選擇創(chuàng)新互聯(lián)建站,為網(wǎng)站保駕護航。
  1. 仿照實際硬件操作,操作UART,GPIO等外設傳遞字符串,在平臺內(nèi)監(jiān)測外設接口,調(diào)用系統(tǒng)函數(shù)$display, $write等打印到terminal;
  2. 構建tube實現(xiàn)打印,相比1效率更高;
  3. 當仿真運行的不是RTL,而是FastModel時,可以借助semihost機制,利用IDE的界面打印;
UART打印
// Retarget.c
// 對printf函數(shù)retarget處理
// 調(diào)用UartPutc(ch);

struct __FILE {int handle;  };
FILE __stdout;
FILE __stdin;

int fputc(int ch, FILE *f) {return (UartPutc(ch));
}

cmsdk_uart_capture_ard.v中捕獲字符串。

Tube打印

直接通過ahb/axi總線往reserved region寫數(shù)據(jù),在平臺中監(jiān)測并打印;
支持不定參數(shù),需要調(diào)用;

//common.h
#include#include#define write_addr(a,v) ((*(volatile uint32_t *)(a)) = (v))
#define read_addr(a) (*(volatile uint32_t *)(a))
#define TUBE_BASE_ADDR (0x2f000000)
#define sim_char(v) write_addr(TUBE_BASE_ADDR+4,v)
#define sim_dec(v)  write_addr(TUBE_BASE_ADDR+8,v)
#define sim_hex(v)  write_addr(TUBE_BASE_ADDR+12,v)
#define sim_bin(v)  write_addr(TUBE_BASE_ADDR+16,v)

#define SIM_INFO_TAG (0x5a5a0001)
#define SIM_WARNING_TAG (0x5a5a0002)
#define SIM_ERROR_TAG (0x5a5a0003)
#define SIM_FATAL_TAG (0x5a5a0004)
#define SIM_MSG_TAG (0x5a5a0005)
#define LF_VAL (10)
#define CR_VAL (13)
#define set_print_tag(v) write_addr(TUBE_BASE_ADDR+20,v)

#define sim_event(v) write_addr(TUBE_BASE_ADDR+24,v)

#define SV2C_HS_ADDR 0xfffc
#define wait_sv2c_event(FLAG,CLEAR) \
do {\
    if(sv2c_event[FLAG] == 0){\
        while(read_addr(SV2C_HS_ADDR) != FLAG) \
        {\
            delay(10); \
        } \
    } \
    if(CLEAR) \
        sv2c_event[FLAG] = 0; \
    else \
        sv2c_event[FLAG] = 1; \
} while(0)

extern uint32_t sv2c_event[10];
extern va_list sim_print(va_list list, char *format,uint32_t tag);
extern void sim_info(char* format, ...);
extern void sim_warning(char* format, ...);
extern void sim_error(char* format, ...);
extern void sim_fatal(char* format, ...);
// common.c
#include "common.h"

uint32_t sv2c_event[10] = {0,0,0,0,0,0,0,0,0,0};

va_list sim_print(va_list list, char *format,uint32_t tag)
{char *char_h;

    __asm volatile(
        "cpsid i \t\n"
        "cpsid f \t\n"
    );
    set_print_tag(tag);
    while(*format !='\0')
    {if(*format == '%')
        {format++;
            switch(*format)
            {case 'd':
                    sim_dec(va_arg(list,int));
                    break;
                case 'x':
                    sim_hex(va_arg(list,int));
                    break;
                case 'h':
                    sim_hex(va_arg(list,int));
                    break;
                case 'b':
                    sim_bin(va_arg(list,int));
                    break;
                case 's':
                    char_h = va_arg(list,char*);
                    while(*char_h !='\0')
                    {sim_char(*char_h);
                        char_h++;
                    }
                    break;
            }
            format++;
        }
        else
        {sim_char(*format);
            format++;
        }
    }
    set_print_tag(SIM_MSG_TAG);
    __asm volatile(
        "cpsie i \t\n"
        "cpsie f \t\n"
    );
    return list;
}

void sim_info(char* format, ...)
{va_list list;
    va_start(list,format);
    list = sim_print(list,format,SIM_INFO_TAG);
    va_end(list);
}

void sim_warning(char* format, ...)
{va_list list;
    va_start(list,format);
    list = sim_print(list,format,SIM_WARNING_TAG);
    va_end(list);
}

void sim_error(char* format, ...)
{va_list list;
    va_start(list,format);
    list = sim_print(list,format,SIM_ERROR_TAG);
    va_end(list);
}

void sim_fatal(char* format, ...)
{va_list list;
    va_start(list,format);
    list = sim_print(list,format,SIM_FATAL_TAG);
    va_end(list);
}

C代碼調(diào)用sim_infosim_warningsim_errorsim_fatal,UVM側相應使用UVM_INFOUVM_WARNINGUVM_ERRORUVM_FATAL實現(xiàn)打印;

event_sync

C和UVM的事件同步,可以通過以下幾種方式:

  1. CPU的中斷或者事件信號
  2. 通過Tube組件實現(xiàn)

完整的可運行代碼可以參考:
百度網(wǎng)盤鏈接:https://pan.baidu.com/s/13eKThizYnrKQzyUIkYhCPA
密碼:csdn

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章標題:Ccase和UVMTB的交互,tube-創(chuàng)新互聯(lián)
當前路徑:http://m.newbst.com/article38/dggopp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設網(wǎng)站設計公司微信小程序做網(wǎng)站服務器托管網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設網(wǎng)站維護公司