当前位置: 首页 > news >正文

如何在interface中处理DUT中的inout信号

        如果在dut中声明为inout类型的信号,处理的方式如下:
        例如dut中声明的信号为inout  [7:0] data;
        在interface声明3个信号,一个是wire型的信号: wire  logic [7:0] data;一个是将外部信号赋值给data的 input 类型的信号:logic [7:0] in_data; 第三个是将data赋值给外部的信号:logic [7:0] out_data; 在interface中利用条件语句将外部变量赋值给data,将data赋值给外部变量,这里注意当外部变量不向data赋值时,需要将data赋值为高组态;当data不向外部变量赋值时,需要将外部变量赋值为0。赋值示例如下:

	assign data=(a==1) ?in_data :'hzz;assign out_data=(a==0) ?data :'h00;

完整的示例如下:

module top(clk,a,data,rst,addr);input clk,a,rst;
inout [7:0] data;
input [7:0] addr;logic [7:0] data_reg ,data_reg_reg;always @(posedge clk or negedge rst)if(!rst)begindata_reg<=0; data_reg_reg<=0;endelse  if (a==1)data_reg<=data;else if (a==0)begin//data_reg<=data_reg+1; data_reg_reg<=data_reg_reg+2;endassign  data= (a==0) ? data_reg_reg : 'hzz;endmoduleinterface simple_bus;logic clk,a,rst;wire  logic [7:0] data;logic [7:0] addr;logic [7:0] in_data;logic [7:0] out_data;assign data=(a==1) ?in_data :'hzz;assign out_data=(a==0) ?data :'h00;endinterfaceclass testbench ;virtual simple_bus this_s;function new (virtual simple_bus s);this_s=s;
endfunctiontask  assignment;repeat(10) @(posedge this_s.clk);//force this_s.a=1;this_s.in_data=66;repeat (10) @(posedge this_s.clk);//force this_s.a=1;this_s.in_data=33;repeat(10) @(posedge this_s.clk);this_s.a=0;//	force this_s.data='h77;
endtaskendclassmodule tb;simple_bus bus();top inst(.clk(bus.clk),.a(bus.a) ,.rst(bus.rst), .data(bus.data) ,.addr(bus.addr)   );testbench class_test=new(bus);;//class_test =new(bus);initial beginbus.clk=0;bus.rst=0;#1000;bus.rst=1;class_test.assignment;//bus.a=0;/* 			#10000;bus.a=1;  force bus.data='d8;#100; force bus.data='d3;#100 ; force bus.data='d7;#10000;bus.a=0; */endalways #5 bus.clk= ~bus.clk;endmodule 

注意:
        不能在class中的task中向wire型变量使用force强制赋值,或者不能使用assign向wire变量连续赋值。
        不能在tb中的initial 语句中对interface中的wire型变量强制赋值。

相关文章:

  • DatePicker与DatePickerDialog
  • Ubuntu创建新用户
  • ElementPlus el-switch开关页面初始化时,change事件自动触发
  • Python使用Mechanize库完成自动化爬虫程序
  • 窗口管理工具 Mosaic mac中文版功能特点
  • 屏蔽机房与普通机房有什么不同?
  • Unity地面交互效果目录
  • uniapp: 实现pdf预览功能
  • 大数据-之LibrA数据库系统告警处理(ALM-12046 网络写包丢包率超过阈值)
  • 【文件读取/包含】任意文件读取漏洞 afr_1
  • Java实现自定义windows右键菜单
  • 【Nginx】使用nginx进行反向代理与负载均衡
  • Datawhale智能汽车AI挑战赛
  • 【C#学习】PictureBox控件
  • Leetcode——岛屿的最大面积
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • css布局,左右固定中间自适应实现
  • Go 语言编译器的 //go: 详解
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java 内存分配及垃圾回收机制初探
  • Java方法详解
  • js数组之filter
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Laravel核心解读--Facades
  • magento2项目上线注意事项
  • mongo索引构建
  • Promise面试题,控制异步流程
  • Python爬虫--- 1.3 BS4库的解析器
  • Spark RDD学习: aggregate函数
  • Terraform入门 - 1. 安装Terraform
  • vue--为什么data属性必须是一个函数
  • 初识 beanstalkd
  • 从零开始在ubuntu上搭建node开发环境
  • 给第三方使用接口的 URL 签名实现
  • 实现菜单下拉伸展折叠效果demo
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 《码出高效》学习笔记与书中错误记录
  • ​520就是要宠粉,你的心头书我买单
  • # .NET Framework中使用命名管道进行进程间通信
  • #mysql 8.0 踩坑日记
  • #单片机(TB6600驱动42步进电机)
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (七)Knockout 创建自定义绑定
  • (四)鸿鹄云架构一服务注册中心
  • (万字长文)Spring的核心知识尽揽其中
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)可以带来幸福的一本书
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *p++,*(p++),*++p,(*p)++区别?
  • .net core 6 redis操作类