System verilog 绑定接口断言时发生UVM配置数据库错误

System verilog 绑定接口断言时发生UVM配置数据库错误,system-verilog,uvm,System Verilog,Uvm,我的测试台上有4个DAI接口实例。我已经用我创建的环境运行了一些模拟,并且没有出现错误问题。但是,当我尝试将断言绑定到接口实例时,会出现一个与在配置数据库中设置接口相关的错误。下面的代码显示了将接口添加到配置数据库的位置: //------------------------------------------------------------------------------------------------------ //Create instances of the interf

我的测试台上有4个DAI接口实例。我已经用我创建的环境运行了一些模拟,并且没有出现错误问题。但是,当我尝试将断言绑定到接口实例时,会出现一个与在配置数据库中设置接口相关的错误。下面的代码显示了将接口添加到配置数据库的位置:

 //------------------------------------------------------------------------------------------------------
//Create instances of the interface for inputs and outputs - note these instances are the same, but they 
//are hooked up differently in the env level             
//------------------------------------------------------------------------------------------------------
//Parallel Inputs - To be used for the input drivers, agents and monitors
dai_if   #(.P_WD_DATA       (P_WD_DATA      ), 
           .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
           .P_WD_OFFSET     (P_WD_OFFSET    ),
           .P_WD_CH_NUM     (P_WD_CH_NUM    ),
           .P_WD_FMT        (P_WD_FMT       ),
           .P_WD_WL         (P_WD_WL        )
            ) 
            dai_par_ivif();

//Serial Inputs - To be used for the input drivers, agents and monitors
dai_if   #(.P_WD_DATA       (P_WD_DATA      ), 
           .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
           .P_WD_OFFSET     (P_WD_OFFSET    ),
           .P_WD_CH_NUM     (P_WD_CH_NUM    ),
           .P_WD_FMT        (P_WD_FMT       ),
           .P_WD_WL         (P_WD_WL        )
            ) 
            dai_ser_ivif();

//Parallel Outputs - To be used for the output monitors and agents
dai_if   #(.P_WD_DATA       (P_WD_DATA      ), 
           .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
           .P_WD_OFFSET     (P_WD_OFFSET    ),
           .P_WD_CH_NUM     (P_WD_CH_NUM    ),
           .P_WD_FMT        (P_WD_FMT       ),
           .P_WD_WL         (P_WD_WL        )
            ) 
            dai_par_ovif();

//Serial Outputs - To be used for the output monitors and agents
dai_if   #(.P_WD_DATA       (P_WD_DATA      ), 
           .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
           .P_WD_OFFSET     (P_WD_OFFSET    ),
           .P_WD_CH_NUM     (P_WD_CH_NUM    ),
           .P_WD_FMT        (P_WD_FMT       ),
           .P_WD_WL         (P_WD_WL        )
            ) 
            dai_ser_ovif();



//------------------------------------------------------------------------------------------------------
//Set interfaces in the database with specific hierachical paths.
//------------------------------------------------------------------------------------------------------
initial begin

    //------------------------------------------------------------------------------------------------------
    //Set these unrequired signals to their default values.
    //------------------------------------------------------------------------------------------------------
    dft_latch_clk       = 1'b1;
    dft_latch_rst_an    = 1'b1;
    scan_mode           = 1'b0;
    scan_enable         = 1'b0;

    uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_in[0]*",  "dai_vif", dai_ser_ivif);
    uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_in[1]*",  "dai_vif", dai_par_ivif);
    uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_out[0]*", "dai_vif", dai_par_ovif);
    uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_out[1]*", "dai_vif", dai_ser_ovif);

    //Scoreboard interface uses the one which drives the clock
    uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_sb[0]*", "dai_vif", dai_ser_ivif);
    uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_sb[1]*", "dai_vif", dai_ser_ivif);

    //Print top level topology
    uvm_top.print();

    //Run specific test using command line switch addition (+UVM_TESTNAME=test_name)
    run_test();

end
我在顶级模块中绑定endmodule之前的接口断言,如下所示:

bind  dai_if :dai_ser_ivif      dai_ser_in_checkers   #(.P_WD_DATA      (P_WD_DATA      ),    
                                                       .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
                                                       .P_WD_OFFSET     (P_WD_OFFSET    ),
                                                       .P_WD_CH_NUM     (P_WD_CH_NUM    ),
                                                       .P_WD_FMT        (P_WD_FMT       ),
                                                       .P_WD_WL         (P_WD_WL        )) ast_dai_ser_in_checkers (bclk, wclk, rst_an, wclk_period, bclk_period,
                                                                                                                    serial_data, sdatout_oe, frame_sync, active_clk, 
                                                                                                                    active_dai, tdm_en, bclk_pol, wclk_pol, dai_en,
                                                                                                                    tdm_ch_en, ch_num, format, offset, wl, parallel_data);

bind  dai_if :dai_ser_ovif      dai_ser_out_checkers  #(.P_WD_DATA      (P_WD_DATA      ),    
                                                       .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
                                                       .P_WD_OFFSET     (P_WD_OFFSET    ),
                                                       .P_WD_CH_NUM     (P_WD_CH_NUM    ),
                                                       .P_WD_FMT        (P_WD_FMT       ),
                                                       .P_WD_WL         (P_WD_WL        )) ast_dai_ser_out_checkers (bclk, wclk, rst_an, wclk_period, bclk_period,
                                                                                                                    serial_data, sdatout_oe, frame_sync, active_clk, 
                                                                                                                    active_dai, tdm_en, bclk_pol, wclk_pol, dai_en,
                                                                                                                    tdm_ch_en, ch_num, format, offset, wl, parallel_data);

bind  dai_if :dai_par_ivif      dai_par_in_checkers   #(.P_WD_DATA      (P_WD_DATA      ),    
                                                       .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
                                                       .P_WD_OFFSET     (P_WD_OFFSET    ),
                                                       .P_WD_CH_NUM     (P_WD_CH_NUM    ),
                                                       .P_WD_FMT        (P_WD_FMT       ),
                                                       .P_WD_WL         (P_WD_WL        )) ast_dai_par_in_checkers (bclk, wclk, rst_an, wclk_period, bclk_period,
                                                                                                                    serial_data, sdatout_oe, frame_sync, active_clk, 
                                                                                                                    active_dai, tdm_en, bclk_pol, wclk_pol, dai_en,
                                                                                                                    tdm_ch_en, ch_num, format, offset, wl, parallel_data);

bind  dai_if :dai_par_ovif      dai_par_out_checkers  #(.P_WD_DATA      (P_WD_DATA      ),    
                                                       .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
                                                       .P_WD_OFFSET     (P_WD_OFFSET    ),
                                                       .P_WD_CH_NUM     (P_WD_CH_NUM    ),
                                                       .P_WD_FMT        (P_WD_FMT       ),
                                                       .P_WD_WL         (P_WD_WL        )) ast_dai_par_out_checkers (bclk, wclk, rst_an, wclk_period, bclk_period,
                                                                                                                    serial_data, sdatout_oe, frame_sync, active_clk, 
                                                                                                                    active_dai, tdm_en, bclk_pol, wclk_pol, dai_en,
                                                                                                                    tdm_ch_en, ch_num, format, offset, wl, parallel_data);
uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_in[0]*",  "dai_vif", dai_ser_ivif);
                                                                                                       |
ncelab: *E,TYCMPAT (/.../dai_top.sv,178|122): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
        uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_in[1]*",  "dai_vif", dai_par_ivif);
                                                                                                               |
ncelab: *E,TYCMPAT (/.../dai_top.sv,179|122): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
        uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_out[0]*", "dai_vif", dai_par_ovif);
                                                                                                               |
ncelab: *E,TYCMPAT (/.../dai_top.sv,180|122): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
        uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_sb[0]*", "dai_vif", dai_ser_ivif);
                                                                                                           |
ncelab: *E,TYCMPAT (/.../dai_top.sv,184|118): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
        uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_sb[1]*", "dai_vif", dai_ser_ivif);
                                                                                                           |                                                        
ncelab: *E,TYCMPAT (/.../dai_top.sv,185|118): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
`

我从这里收到的错误指向我在配置数据库中设置接口的行,如下所示:

bind  dai_if :dai_ser_ivif      dai_ser_in_checkers   #(.P_WD_DATA      (P_WD_DATA      ),    
                                                       .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
                                                       .P_WD_OFFSET     (P_WD_OFFSET    ),
                                                       .P_WD_CH_NUM     (P_WD_CH_NUM    ),
                                                       .P_WD_FMT        (P_WD_FMT       ),
                                                       .P_WD_WL         (P_WD_WL        )) ast_dai_ser_in_checkers (bclk, wclk, rst_an, wclk_period, bclk_period,
                                                                                                                    serial_data, sdatout_oe, frame_sync, active_clk, 
                                                                                                                    active_dai, tdm_en, bclk_pol, wclk_pol, dai_en,
                                                                                                                    tdm_ch_en, ch_num, format, offset, wl, parallel_data);

bind  dai_if :dai_ser_ovif      dai_ser_out_checkers  #(.P_WD_DATA      (P_WD_DATA      ),    
                                                       .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
                                                       .P_WD_OFFSET     (P_WD_OFFSET    ),
                                                       .P_WD_CH_NUM     (P_WD_CH_NUM    ),
                                                       .P_WD_FMT        (P_WD_FMT       ),
                                                       .P_WD_WL         (P_WD_WL        )) ast_dai_ser_out_checkers (bclk, wclk, rst_an, wclk_period, bclk_period,
                                                                                                                    serial_data, sdatout_oe, frame_sync, active_clk, 
                                                                                                                    active_dai, tdm_en, bclk_pol, wclk_pol, dai_en,
                                                                                                                    tdm_ch_en, ch_num, format, offset, wl, parallel_data);

bind  dai_if :dai_par_ivif      dai_par_in_checkers   #(.P_WD_DATA      (P_WD_DATA      ),    
                                                       .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
                                                       .P_WD_OFFSET     (P_WD_OFFSET    ),
                                                       .P_WD_CH_NUM     (P_WD_CH_NUM    ),
                                                       .P_WD_FMT        (P_WD_FMT       ),
                                                       .P_WD_WL         (P_WD_WL        )) ast_dai_par_in_checkers (bclk, wclk, rst_an, wclk_period, bclk_period,
                                                                                                                    serial_data, sdatout_oe, frame_sync, active_clk, 
                                                                                                                    active_dai, tdm_en, bclk_pol, wclk_pol, dai_en,
                                                                                                                    tdm_ch_en, ch_num, format, offset, wl, parallel_data);

bind  dai_if :dai_par_ovif      dai_par_out_checkers  #(.P_WD_DATA      (P_WD_DATA      ),    
                                                       .P_CH_NUM_MAX    (P_CH_NUM_MAX   ),
                                                       .P_WD_OFFSET     (P_WD_OFFSET    ),
                                                       .P_WD_CH_NUM     (P_WD_CH_NUM    ),
                                                       .P_WD_FMT        (P_WD_FMT       ),
                                                       .P_WD_WL         (P_WD_WL        )) ast_dai_par_out_checkers (bclk, wclk, rst_an, wclk_period, bclk_period,
                                                                                                                    serial_data, sdatout_oe, frame_sync, active_clk, 
                                                                                                                    active_dai, tdm_en, bclk_pol, wclk_pol, dai_en,
                                                                                                                    tdm_ch_en, ch_num, format, offset, wl, parallel_data);
uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_in[0]*",  "dai_vif", dai_ser_ivif);
                                                                                                       |
ncelab: *E,TYCMPAT (/.../dai_top.sv,178|122): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
        uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_in[1]*",  "dai_vif", dai_par_ivif);
                                                                                                               |
ncelab: *E,TYCMPAT (/.../dai_top.sv,179|122): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
        uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_out[0]*", "dai_vif", dai_par_ovif);
                                                                                                               |
ncelab: *E,TYCMPAT (/.../dai_top.sv,180|122): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
        uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_sb[0]*", "dai_vif", dai_ser_ivif);
                                                                                                           |
ncelab: *E,TYCMPAT (/.../dai_top.sv,184|118): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
        uvm_config_db#(virtual dai_if)::set(uvm_root::get(), "uvm_test_top.dai_env.dai_sb[1]*", "dai_vif", dai_ser_ivif);
                                                                                                           |                                                        
ncelab: *E,TYCMPAT (/.../dai_top.sv,185|118): formal and actual do not have assignment compatible data types (expecting datatype compatible with 'virtual interface dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2))' but found an incompatible 'dai_if#(.P_WD_DATA(24),.P_WD_OFFSET(11),.P_CH_NUM_MAX(8),.P_WD_CH_NUM(3),.P_WD_FMT(2),.P_WD_WL(2)) instance' instead).
我在格式化错误消息时遇到一些问题。指针“|”应该位于每个接口实例的下面,例如dai_ser_ivif。如果我删除bind语句,模拟运行良好,不会出现与上面类似的错误。因此,我假设这个问题与绑定过程有关,但是,错误似乎是在抱怨我正在配置数据库中使用接口(而不是虚拟接口)设置虚拟接口

任何建议或指点都将受到高度重视


谢谢。

配置数据库设置需要类型兼容性,当您使用参数化接口时,在配置数据库中设置虚拟接口时应使用相同的类型。e、 g

//Serial Inputs - To be used for the input drivers, agents and monitors
dai_if   #(.P_WD_DATA (P_WD_DATA)) dai_ser_ivif();

uvm_config_db#(virtual dai_if#(P_WD_DATA))::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_in[0]*",  "dai_vif", dai_ser_ivif);

配置数据库设置要求类型兼容性,当您使用参数化接口时,在配置数据库中设置虚拟接口时应使用相同的类型。e、 g

//Serial Inputs - To be used for the input drivers, agents and monitors
dai_if   #(.P_WD_DATA (P_WD_DATA)) dai_ser_ivif();

uvm_config_db#(virtual dai_if#(P_WD_DATA))::set(uvm_root::get(), "uvm_test_top.dai_env.dai_ag_in[0]*",  "dai_vif", dai_ser_ivif);

听起来像是工具问题。
nchelp ncelab TYMPAT
除了告诉我错误与不匹配的数据类型有关外,没有提供更多的信息。顺便说一句,我运行了一些额外的测试,并注意到如果我为所有四个接口(如ast_dai_ser_in_checkers)绑定相同的接口(如dai_ser_in_checkers)和相同的实例名(如ast_dai_ser_in_checkers),代码将编译。但是,每当我更改这些值中的任何一个时,都会得到相同的错误。有没有想过为什么会这样?模拟器可能会对接口进行非限定,因为绑定会为每个实例创建不同的层次结构。也许您可以将ser/par_in/out_checker dai_ser/par_in/out_checker放在一个模块中,并通过利用
uvm_re_match
uvm_glob_to_re
与分层路径来决定应该使用哪个ser/par_in/out模式。示例:
uvm\u re\u匹配(“dai\u par\u ivif”,“$sformaf”(%m))
@Greg,你能提供更多关于我应该在层次结构中的何处使用此命令的信息吗?我在网上查找了一些使用此命令的示例,但找不到任何内容。听起来像是工具问题。
NCELP ncelab TYMPAT
除了告诉我错误与不匹配有关外,没有提供更多信息另一方面,我运行了一些额外的测试,并注意到如果我用相同的实例名(例如ast_dai_ser_in_checkers)绑定相同的接口(例如dai_ser_in_checkers)对于所有四个接口,代码都会编译。但是,每当我更改这些值中的任何一个时,我都会得到相同的错误。有没有想过为什么会出现这种情况?模拟器可能会对接口进行统一设置,因为绑定会为每个实例创建不同的层次结构。也许您可以将dai_ser/par_in/out_checker放入单个模块中,然后运行一次通过使用分层路径的
uvm\u-re\u-match
uvm\u-glob\u-to\u-re
来决定应该使用哪种ser/par\u-in/out模式。例如:
uvm\u-re\u-match(“dai\u-par\u-ivif”,“$sformaf”(%m))
@Greg,您能否提供更多关于我应该在分层中的何处使用此命令的信息?我在网上找了一些这种用法的例子,但什么也找不到。