日常记录(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以及后续的两个。
其它
Le vent se lève! . . . il faut tenter de vivre!
Le vent se lève! . . . il faut tenter de vivre!

浙公网安备 33010602011771号