在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
12
返回列表 发新帖
楼主: 宋凡

[求助] interface里面定义了wire类型变量,在driver里面如何赋值?

[复制链接]
 楼主| 发表于 2019-10-27 18:40:51 | 显示全部楼层
你们就没有遇到过这种情况么?
 楼主| 发表于 2019-10-28 10:27:54 | 显示全部楼层
发表于 2019-10-28 14:30:42 | 显示全部楼层
assign  a_if.sda_out= a_if.sda_output ? sda : 1'bz;

assign  sda= (a_if.sda_output == 0) ?a_if.sda_in:1'bz;

如上就是 三态门 实现的 sda 接口的inout  ;  在interface中 加一个 sda_output  控制信号
发表于 2019-10-28 14:46:13 | 显示全部楼层
你force语句加的地方估计不对,或者可以参考诸葛的分拆inout方法。另外,你要force wire,不要force inout,不过其实差别不大。
 楼主| 发表于 2019-10-28 19:12:26 | 显示全部楼层


诸葛小天 发表于 2019-10-28 14:30
assign  a_if.sda_out= a_if.sda_output ? sda : 1'bz;

assign  sda= (a_if.sda_output == 0) ?a_if.sda_i ...




   assign  c_vif.DATA  = c_vif.HBG_m_n? 1:'bz;
还是报错:
通过虚拟接口访问的变量不能用于连续分配
发表于 2019-10-29 14:21:41 | 显示全部楼层
不能用force, 试试下面的例子

interface dut_if(input logic clk);
        parameter hold_time   =3;  // 3ns  
        parameter setup_time  = 5;
        wire[31:0] data;
        logic[31:0] address;
        logic rd, wr;
        clocking driver_cb @(posedge clk);
                default input #setup_time output #hold_time;
                output address;
                output rd, wr;
                inout data;
        endclocking
        modport dut_mp(inout data, input clk, rd, wr, address);
        modport driver_mp(clocking driver_cb);
endinterface : dut_if

class driver;
        virtual interface dut_if.driver_mp v_if;
        transaction tx        =new();
        // driver
        task automatic drive();
                if(!randomize(tx))  $error("randomization failure");
                @ (v_if.driver_cb) begin
                        if(!randomize(tx))  $error("randomization failure");
                        v_if.driver_cb.rd                                  <= tx.rd;
                        v_if.driver_cb.wr                                  <= tx.wr;
                        v_if.driver_cb.address                             <= tx.address;
                        if(tx.wr)  v_if.driver_cb.data  <= tx.data_dr;   
                        else  v_if.driver_cb.data  <=  'hZ;
                end
        endtask : drive
endclass : driver
 楼主| 发表于 2019-11-11 10:13:11 | 显示全部楼层


csgood 发表于 2019-10-29 14:21
不能用force, 试试下面的例子

interface dut_if(input logic clk);


好的 谢谢。 现在编译通过了,但是运行报错了。
# ** Fatal: (SIGSEGV) Bad handle or reference.
#    Time: 100515 ns  Iteration: 1  Process: /uvm_pkg::uvm_task_phase::execute/#FORK#137(#ublk#215181159#137)_4f613d82 File: cluster_slave_monitor.sv
# Fatal error in Task demo_top_sv_unit/cluster_slave_monitor::collect_one_pkt at cluster_slave_monitor.sv line 60
#
# HDL call sequence:
# Stopped at cluster_slave_monitor.sv 60 Task demo_top_sv_unit/cluster_slave_monitor::collect_one_pkt
# called from  cluster_slave_monitor.sv 35 Task demo_top_sv_unit/cluster_slave_monitor::run_phase
# called from  E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_common_phases.svh 245 Task uvm_pkg/uvm_run_phase::exec_task
# called from  E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_task_phase.svh 150 Function uvm_pkg/uvm_task_phase::execute


58        if(c_vif.BMS_n == 1'b0)begin
59        @(posedge c_vif.AXI_ACLK);
60        mom_vif.cb.ACK <= (c_vif.BMS_n == 1'b0)?1:'bz;
61        c_tr.option = BOOT_EPROM;
62        `uvm_info(get_type_name(), "begin to collect_BOOT_EPROM:", UVM_LOW)       
63        end

发表于 2019-11-15 12:27:21 来自手机 | 显示全部楼层
在tb用个中间信号转换
 楼主| 发表于 2019-12-20 15:31:29 | 显示全部楼层


csgood 发表于 2019-10-29 14:21
不能用force, 试试下面的例子

interface dut_if(input logic clk);


平台连接dut的部分是不是要dut_mp来连接?
发表于 2020-1-3 16:56:25 | 显示全部楼层
三态门拆分一下

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-25 15:34 , Processed in 0.020671 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表