首页
书签
论坛
网盘
邮件
壁纸
影视
在线音乐
更多
直播
统计
个人微博
云笔记
云存储
图片视频
友链
留言
关于
Search
1
文档内容搜索哪家强? 15款文件搜索软件横向评测
13 阅读
2
常见系统部署(1)
11 阅读
3
makfile 知识汇总
10 阅读
4
Verilog-AMS Verilog-A介绍
7 阅读
5
欢迎使用 Typecho
5 阅读
默认分类
数字电路
芯片后端
模拟电路
芯片验证
原型验证
算法与架构
DFX与量产
windows设置
Linux设置
MacOS设置
移动OS设置
软件方案
登录
Search
标签搜索
python
PyQT
systemverilog
Alist
Docker
cadence
sv
webdav
vscode
cpp
upf
ESL
TLM
浏览器
virtuoso
tsmc8rf
TSMC
CXL
PCIE
Yosys
bennyhe
累计撰写
46
篇文章
累计收到
8
条评论
首页
栏目
默认分类
数字电路
芯片后端
模拟电路
芯片验证
原型验证
算法与架构
DFX与量产
windows设置
Linux设置
MacOS设置
移动OS设置
软件方案
页面
书签
论坛
网盘
邮件
壁纸
影视
在线音乐
直播
统计
个人微博
云笔记
云存储
图片视频
友链
留言
关于
搜索到
1
篇与
的结果
2025-05-27
SV中inout与ref区别
一、Inout是什么?inout百度翻译为“双向,双向总线”,顾名思义就是该类型端口既能做输入又能做输出。很多需要交互的芯片外部的有些管脚都会使用inout类型,尤其是需要与外界做双向通信的数据总线与地址总线。在需要用到inout类型搭建仿真验证平台时,需要注意以下两个方面:1.在例化端口时,需将顶层的inout型的信号必须变为wire型;2.在编写assign语句时,其必须放在initial或always块外部。想对inout型的信号进行读写操作时需使用assign语句,具体代码如下:module TB(); wire data_inout; reg data_reg; reg db_link; initial begin .......... end assign data_inout = db_link ? data_reg : 1'hz; endmodule二、Ref是什么?Ref为Reference的缩写,百度翻译为“参考,引用”。通过查阅资料,ref类型会使参数按照引用传递。下面为本人在验证工作时碰到的一个例子:设计(DUT)源程序部分代码:module DUT; endmodule验证环境 (Test_Bench—cpu_mod) 部分代码:`timescale 1ns/1ps module cpu_mod; parameter cpu_period = 33.33; parameter cpu_period*2 = 66.67; parameter cpu_period*9 = 299.97; initial begin write_flag = 0; end task automatic cpu_write (input [15:0] addr , input [15:0] data , ref logic cs); dut.if.ebi_rd_wr = 1'b1; cs = 1 ; #cpu_period; dut.if.ebi_addr = addr ; dut.if.ebi_rd_wr = 1'b0 ; dut.if.ebi_ts = 1'b0 ; cs = 0 ; #cpu_period*2; dut.if.ebi_ts = 1'b1 ; write_flag = 1 ; cpu_wdata = data ; dut.if.ebi_we_be0 = 1'b0 ; dut.if.ebi_we_be1 = 1'b0 ; #cpu_period*9; dut.if.ebi_rd_wr = 1'b1 ; dut.if.ebi_we_be0 = 1'b1 ; dut.if.ebi_we_be1 = 1'b1 ; #cpu_period; write_flag = 0 ; dut.if.ebi_addr = 16'hz ; cpu_wdata = 16'h0 ; cs = 1 ; endtask endmodule测试用例 (Test_Case) 部分代码:`timescale 1ns/1ps module testcase(interface dut_if); bit [15:0] cpu_addr1 = 16'h1803; bit [15:0] cpu_data1 = 16'h1234; initial begin #150ms; cpu_mod.cpu_write (cpu_addr1,cpu_data1,dut_if.ebi_cs3); end endmodule 1)代码结构的思路待更新2)代码结构的说明待更新三、两者区别是什么?当task和function的形式参数被声明为input类型时,input类型的形参只是进行了数值的拷贝;而当task和function的形式参数被声明为output类型时,output类型的形参会在return时刻将数值拷贝至接收方。这就不难得出 inout 类型不仅会在输入时进行数值的拷贝,而且会在输出时将数值拷贝至接收方。Ref 类型的形参,我们做的不是拷贝,而是 引用 。对于task来讲,ref类型的参数,其外部是可见的,换句话说在外部对ref的形参数值进行的修改,task是可见且同步变化的;而inout类型的参数,task得到的仅仅是一个拷贝过来的数值,在整个task运行期间,外部的数值无论发生什么变化,对于task而言是未知的,同理task对该数值在其内部进行的修改,只有task运行结束后,外部才会获得该值。四、两者联系/区别总结Inout 与 Ref 均可以在task与function中传入传出数据;Inout 在外部传递的参数改变时,其调用的task或function无法实时更新,只有当调用的task或function执行完毕后才会发生变化;Ref 在外部传递的参数改变时,其调用的task或function能够实时更新数值;Ref 操作不需要消耗仿真时间,而 Inout 则需要消耗仿真时间。————————————————版权声明:本文为CSDN博主「进击的砰砰砰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_42493102/article/details/122311686
2025年05月27日
3 阅读
0 评论
1 点赞