日常记录(58)agent结构

 https://gitee.com/bai-mengwei/AHB2

AGETN的结构

一般,在env中实例化agent后,同时会实例化一个config,里面包括了vif、is_active等信息,由env将其传入到agent中。agent取时用时,则从config里进行。

 

master和slave大体相同。但是master中的monitor,其write是通过analysis_port,接入到agent的analysis_port。而agent的analysis_port又接入到scb的analysis_export,实现数据发送。

而master agent的analysis_port也接入到了env的一个analysis_port,slave agent的analysis_port也接入到了env的另一个analysis_port。好像没有用到。应该舍弃。

 

 

AHB的总线控制

数量

信号列表中,除去时钟、复位,剩下11条主要总线。再除去译码器的片选信号,HPORT的保护控制(主机)特殊功能,剩下9条。

其中主机为6条线,从机为3条线。

        bit reset;
        bit [31:0] address[$];
        bit [31:0] write_data[$];
        transfer_t trans_type;
        burst_t burst_mode;
        size_t trans_size;
        rw_t read_write;

        bit [31:0] read_data[$];
        rand resp_t response;
        rand bit ready[];

枚举

说明和使用的控制信号线,可以使用枚举

typedef enum bit[1:0] {IDLE, BUSY, NONSEQ, SEQ} transfer_t;
typedef enum bit {READ, WRITE} rw_t;
typedef enum bit [2:0] {SINGLE, INCR, WRAP4, INCR4, WRAP8, INCR8, WRAP16, INCR16} burst_t;
typedef enum bit [2:0] {BYTE, HALFWORD, WORD, WORDx2, WORDx4, WORDx8, WORDx16, WORDx32} size_t;
typedef enum bit [1:0] {OKAY, ERROR, RETRY, SPLIT} resp_t;

  

功能覆盖率写法

https://www.cnblogs.com/zhiminyu/p/14210170.html:eap是在subscriber里的。

该工程没有基本板SCB,只有功能覆盖率的类。当montior发送给SCB(COV)后,执行write函数。

结束运行后,先收集cov,然后检查,报告cov,执行最后的phase。(4个)

class ahb_coverage extends uvm_subscriber#(ahb_mxtn);

        `uvm_component_utils(ahb_coverage)

        env_config env_cfg;

        ahb_mxtn ahb_xtn, xtn;

        //Stats
        real cov;

        covergroup ahb_cg;

                option.per_instance = 1;

                RST: coverpoint ahb_xtn.reset;
                WR: coverpoint ahb_xtn.read_write;
                TRANS: coverpoint ahb_xtn.trans_type[0];
                SIZE: coverpoint ahb_xtn.trans_size {bins s[] = {[BYTE:WORD]};}
                //ERR_SIZE: coverpoint ahb_xtn.trans_size {bins e_s[] = {[WORDx2:WORDx32]};}
                BURST: coverpoint ahb_xtn.burst_mode;
                ADDR: coverpoint ahb_xtn.address[0] {option.auto_bin_max = 32;}
                WDATA: coverpoint ahb_xtn.write_data[0] {option.auto_bin_max = 32;}
                RDATA: coverpoint ahb_xtn.read_data {option.auto_bin_max = 32;}
                RESP: coverpoint ahb_xtn.response {bins rsp[] = {OKAY, ERROR};}
                RDY: coverpoint ahb_xtn.ready;
                WRxSIZE: cross WR, SIZE;
                BURSTxSIZE: cross BURST, SIZE;
                WRxBURST: cross WR, BURST;
                WRxBURSTxSIZE: cross WR, BURST, SIZE;

        endgroup


        //-------------------------------------------------
        // Methods
        //-------------------------------------------------

        extern function new(string name = "ahb_coverage", uvm_component parent);
        extern function void build_phase(uvm_phase phase);
        extern function void write(ahb_mxtn t);
        extern function void extract_phase(uvm_phase phase);
        extern function void report_phase(uvm_phase phase);

endclass: ahb_coverage

        //Constructor
        function ahb_coverage::new(string name = "ahb_coverage", uvm_component parent);
                super.new(name, parent);

                ahb_cg = new();
        endfunction

        //Build
        function void ahb_coverage::build_phase(uvm_phase phase);
                if(!uvm_config_db#(env_config)::get(this, "", "env_config", env_cfg))
                begin
                        `uvm_fatal(get_full_name(), "Cannot get ENV-CONFIG from configuration database!")
                end
                xtn = new("xtn");
                super.build_phase(phase);
        endfunction

        function void ahb_coverage::write(ahb_mxtn t);
                ahb_xtn = t;
                ahb_cg.sample();
        endfunction

        //Extract
        function void ahb_coverage::extract_phase(uvm_phase phase);
                cov = ahb_cg.get_coverage();
        endfunction

        //Report
        function void ahb_coverage::report_phase(uvm_phase phase);
                `uvm_info(get_type_name(), $sformatf("Coverage is: %f", cov), UVM_MEDIUM)
        endfunction

  

勘误

interface中的断言错误

断言的前几条、中间部分

modport使用很少

仅在slv的drv中进行了部分声明,使用仍然是clk_blk

主机中的约束

部分很奇怪,如kb_boundry,h_size以及后续的两个。

 

其它

 

posted @ 2022-02-18 10:47  大浪淘沙、  阅读(316)  评论(0)    收藏  举报