日常记录(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!