MCDF实验_lab0(0)
目录
- 一、MCDF功能描述[^1]
- MCDF结构
- slave端口时序
- formater端口时序
- 寄存器时序
- 二、代码分析
- 时间单位
- 信号
- 例化
- 产生时钟
- 产生复位
- 发送激励
- 三、Questasim的Makefile[^2]
- 四、波形
一、MCDF功能描述1
MCDF结构
多通道的数据经fifo流入arbiter,arbiter对通道进行选择,将数据打包发送出去
slave端口时序
valid为高表示有发送数据的请求,同时发送数据,ready为高表示数据写书成功
formater端口时序
chid数据通道,length数据长度(持续到数据结束,多两个cycle),req为高(持续两个cycle)表示有发送数据请求,三个信号同时发送;一个cycle后,grant(持续两个cycle)同意发送数据;一个cycle后开始发送数据。
数据准备好,一个cycle后,进入fifo,发送数据发送请求;
一个cycle后,formater说好的我收到了,你开始发数据吧;
一个cycle后,这边知道了,我马上发
寄存器时序
- 写地址,写命令和写数据在同一个时钟上升沿发送
- 读地址,读命令在时钟上升沿发送,读出数据在下一个时钟上升沿得到
- IDLE,为什么要等一拍,不懂
二、代码分析
时间单位
`timescale 1ns/1ps// 单位/精度
信号
reg为寄存器变量,用于过程赋值
wire为线,用于连续赋值
输出数据用reg,输入数据用wire
reg clk;
reg rstn;reg [31:0] ch0_data;//输出数据到DUT
reg ch0_valid;//输出有效信号到DUT
wire ch0_ready;//DUT输入ready
wire [ 5:0] ch0_margin;//DUT输入fifo余量reg [31:0] ch1_data;
reg ch1_valid;
wire ch1_ready;
wire [ 5:0] ch1_margin;reg [31:0] ch2_data;
reg ch2_valid;
wire ch2_ready;
wire [ 5:0] ch2_margin;wire [31:0] mcdt_data;//DUT输出当前输出的数据
wire mcdt_val; //DUT输出当前输出的有效信号
wire [ 1:0] mcdt_id; //DUT输出当前输出的通道号
例化
将tb的信号与dut的端口相连
mcdt dut(.clk_i(clk),.rstn_i(rstn),.ch0_data_i(ch0_data),.ch0_valid_i(ch0_valid),.ch0_ready_o(ch0_ready),.ch0_margin_o(ch0_margin),.ch1_data_i(ch1_data),.ch1_valid_i(ch1_valid),.ch1_ready_o(ch1_ready),.ch1_margin_o(ch1_margin),.ch2_data_i(ch2_data),.ch2_valid_i(ch2_valid),.ch2_ready_o(ch2_ready),.ch2_margin_o(ch2_margin),.mcdt_data_o(mcdt_data),.mcdt_val_o(mcdt_val),.mcdt_id_o(mcdt_id)
);
产生时钟
周期为10,5s翻转一次
initial begin clk <= 0;forever begin#5 clk <= !clk;end
end
产生复位
仿真开始,等待10ns复位
再等待10个上升沿,10ns+5ns+90ns
initial begin #10 rstn <= 0;repeat(10) @(posedge clk);rstn <= 1;
end
发送激励
等待复位信号105ns:clk↑,rstn↑再等clk↑为下一个时钟
等待五次上升沿:105+50=155ns
三个通道依次发送数据:等待一个clk再发送数据:165ns
initial begin @(posedge rstn);repeat(5) @(posedge clk);// channel 0 testchnl_write(0, 'h00C0_0000);chnl_write(0, 'h00C0_0001);// channel 1 testchnl_write(1, 'h00C1_0000);chnl_write(1, 'h00C1_0001);// channel 2 testchnl_write(2, 'h00C2_0000);chnl_write(2, 'h00C2_0001);
end
发送有效数据间隔一个时钟再次发送有效数据
等待一个clk发送数据
// channel write task
task chnl_write(input reg[1:0] id, input reg[31:0] data); case(id)0: begin@(posedge clk);//模仿时序逻辑,等到上升沿后发送数据ch0_valid <= 1;ch0_data <= data;@(posedge clk);//模仿时序逻辑,等到上升沿后发送无效ch0_valid <= 0;ch0_data <= 0;end1: begin@(posedge clk);ch1_valid <= 1;ch1_data <= data;@(posedge clk);ch1_valid <= 0;ch1_data <= 0;end2: begin@(posedge clk);ch2_valid <= 1;ch2_data <= data;@(posedge clk);ch2_valid <= 0;ch2_data <= 0;enddefault: $error("channel id %0d is invalid", id);endcase
endtask
三、Questasim的Makefile2
- 用户变量:top和要编译的文件,需要修改
- 环境变量:
-vopt: simulate full optimization;
-novopt: simulate without optimization
-voptargs=+acc: simulate
v10.7用-voptargs=+acc
v10.6用-novopt,不然会默认优化一些没有用到的参数,就无法查看这些参数- 其它
-c: command模式,不启动图形界面
-do “xxx”: 执行xxx命令- 命令行输入
vsim & 启动questa
restart 重新开始仿真
f 查看全部波形
vlog 编译
run -all
log -r /* 保存信号,-r递归,/*层层循环保存所有信号
#############################
# User variables
#############################
TB = tb1
DFILES = {arbiter.v,slave_fifo.v,mcdt.v}
VFILES = $(TB).v
#############################
# Environment variables
#############################
VLAB = vlib work #创建名为work的lib
VCOMP = vlog -l com.log #vlog编译;-l com.log将日志存放到com.log中
VSTART = vsim -l sim.log #vsim启动questa
VSIMULATE = -voptargs=+acc #simulate
VADDWAVE = add wave -position insertpoint sim:/$(TB)/*#添加top文件的波形
VSAVE = log -r /*#生成波形文件
RUN = run 1us #运行1ns
VQUIT = quit -f #退出all: create_lib compile simulate #make要执行的顺序create_lib:$(VLAB)compile:$(VCOMP) $(DFILES) $(VFILES)simulate:#$(VSTART) -c $(VSIMULATE) work.$(TB) -do "$(SAVE) $(RUN);$(VQUIT)"$(VSTART) $(VSIMULATE) work.$(TB) -do "$(VADDWAVE);$(VSAVE);$(RUN)"clean:rm -rf work mti_lib transcript modelsim.ini *.log vsim.wlf
四、波形
https://recclay.blog.csdn.net/article/details/118121495 ↩︎
https://blog.csdn.net/qq_39794062/article/details/113402057 ↩︎
MCDF实验_lab0(0)相关推荐
- MCDF实验4(4)
目录 引言:接着上篇的MCDF实验4(3),解释一下添加的检查 1)通道 en=0 时的检查 2)arbiter 的仲裁功能的检查 在tb.sv 中 连接信号 引言:接着上篇的MCDF实验4(3),解 ...
- 口令攻击实验V2.0
口令攻击实验V2.0 实验目标 解开flag.rar的口令,获得解压缩文件中的Flag. 实验初始线索 打开nnn.docm,其中会有下一步指示. 提示:文档nnn.docm的打开口令由6位小写英文字 ...
- MCDF实验——Lab4
在之前的Lab3中,通过一个初具规模的MCDT的验证环境,学习到: 验证环境按照隔离的观念,应分为硬件DUT,软件验证环境,和处于信号媒介的接口interface. 对于软件验证环境,需要经历建立阶段 ...
- c语言用p1口进行转弯灯实验,P1.0口转弯灯程序 单片机IO口的应用
P1.0开关接5V时,右转弯灯闪亮,P1.1开关接5V时左转弯灯闪亮.P1.0.P1.1 开关同时接5V或接地时,转弯灯均不闪亮. 程序框图 P1.0开关接5V时,右转弯灯闪亮,P1.1开关接5V时左 ...
- MCDF实验_lab1(1)
目录 一.问题 二.实验要求 三.代码分析 时间单位 信号 例化 产生时钟 产生复位 发送激励模块 产生数据 实例化slave模块 发送激励 三.Questasim的Makefile[^2] 四.波形 ...
- 逆向工程实验_lab0(密码学算法逆向)
文章目录 一级目录 1. cipher text 2. cipher text 3. Vigenere cipher text 4.Rar file without password 一级目录 1. ...
- 网络渗透实验1.0——网络扫描与网络侦察
1.实验目的: 理解网络扫描.网络侦察的作用:通过搭建网络渗透测试平台,了解并熟悉常用搜索引擎.扫描工具的应用,通过信息收集为下一步渗透工作打下基础. 2.实验内容: 1.用搜索引擎Google或百度 ...
- ESP32实验03:0.96tft液晶显示屏驱动
基于ST7735s的0.96寸tft屏幕显示 效果展示 实现了时钟显示,基于ds1307模块,时钟字体采用的模拟数码管字体 实现了图标显示,后续用于天气以及状态指示 暂未添加网络校时,以及网络获取天气 ...
- MCDF实验——Lab5
Lab5主要完成如何定义覆盖率,如何从验证计划到测试用例的实现,最后再到覆盖率的量化.验证量化分为代码覆盖率和功能覆盖率. 一.编译 在编译过程中,需要对于设计相关的文件设置额外的覆盖率编译选项. 只 ...
最新文章
- 拼多多“砍价免费拿”始终差“0.09%”遭起诉,官方回应:活动真实
- 动态规划 dp03 最长公共子串问题 c代码
- python——文件操作File
- VTK:vtkCellArray用法实战
- 电力电子应用技术_RFID技术应用在电力行业工具管控
- C#继承与多态 virtual虚方法的使用 在子类中使用override重写父类函数
- http请求post,返回excel文件,并接收
- 100条常用写作谚语(1)(2)(3)(4)
- r语言如何读取matlab数据类型,[转载]R语言数据类型解析[转]
- ISTQB高级国际认证试题及答案(一)
- 【Oracle经典】132个oracle热门精品资料——下载目录收藏 (转载)
- android checkbox 选中事件_挖穿Android第四十九天
- 【100题】第十九题(斐波那楔数列)
- 简单的遗传算法实例(MATLAB版)
- Docker加速器 DaoCloud
- 好书推荐《月亮与六便士》
- 《吐血整理》一篇文章教你学废Git版本管理
- win10添加打印机失败,无法正常使用打印机的解决办法
- Quasi-Monte Carlo Image Synthesis in a Nutshell——低差异序列
- android实现音乐播放器(进度条)
热门文章
- 深度学习中需要的矩阵计算
- 50个开机进BIOS按键查询
- 2018年蓝桥杯A组C/C++决赛题解
- 免费的移动硬盘数据恢复软件EasyRcovery15
- 学习Python全套代码【超详细】Python入门、核心语法、数据结构、Python进阶【致那个想学好Python的你】
- 在Windows 下的 Qt 应用程序获得 Administrator 权限
- c语言蚂蚁王国的货币系统,蚂蚁王国的探索之旅
- SQL(之一)-SQL经典题目
- python毕业设计能做什么工作_用python可以做什么毕业设计项目|融资公司的主要业务...
- 关于mirro多仓库配置的一些问题