2.1.2 -5【实验:发送紧密数据&问题分析&接口时钟&函数任务参数方向】

questa的 linux仿真

  • vlog -sv …/mcdt/v1/{arbiter.v , slave_fifo.v,mcdt.v} tb4_ref.sv

  • vsim -i(图形界面) -voptargs=+acc work.tb4_ref &

发送紧密数据

数据紧凑 chnl0 发送完,发送chnl1, chnl2, arbiter 每一拍可以送出 32 bit 的数据, 3个chnl 理论上可以进来3个 32bit 的数据 ,如果上面水量大, 下面水量小 arbiter 有时候处理不过来, arbiter 处理不过来时, 3个 slave 的 fifo 就要起到缓冲的作用, 保存 arbiter 处理不了的数据。

chnl 还是发送一拍歇一拍, 先让 3 个chnl 忙起来 (并行发送), arbiter 才有可能忙不过来

在这里插入图片描述

  • 2 拍发送一个数据 ,3 个 chnl 同时发, 平均下来 1 拍发 1.5个 word 数据 , arbiter 出 1 个 word , 不断有数据进来 fifo 终将被写满( valid 标识), 当 fifo 余量为 0 时, ready 信号就拉低了

在这里插入图片描述

  • 3个 fifo 被写满, 因为arbiter 一直往外流数据, 故arbiter 流数据的时候 其中一个fifo 会释放一个数据

  • chnl_write 要紧凑发数据, 把 chnl_idle 注释掉, 一直发送 200 个数据发送完后 valid 没有拉低, 会导致最后一直发送最后一个数据

在这里插入图片描述

  • chnl_idle 放入 数据发送块中 ,就可以解决

在这里插入图片描述
在这里插入图片描述

dump -add /*

V 与 SV

rstn 为 logic 类型, 初始值是 x(这一时刻可能是0可能是 1) , 红色表示 x , 仿真器理解行为 x 到0 ,跟真实电路行为有误差,真实电路只有0 和 1,

rstn 改成 bit 类型, 没有从 x 到 0 这样一个变化, 对设计进行测试之前, 设计没有做过有效复位, 很难预测下面会发送什么 , 复位是 功能进行之前必要完成的动作,一上电之后先复位

方法 task 和函数 function

要调用 task 触发。 initial 是否结束 取决于里面的 task 是否结束。

forever
VSC测量时钟
当发现 TB 中的时钟不是与设计同源同频的时钟,要检查是不是 TB 里的时钟错了

module `timescale 1ns/1ps

#5 (默认 5ns)也可以强制 #5ns, 最小只能识别到 ps 这个单位

职业落脚点是精通到哪个方向上面, 验证离不开 设计 , spec, 协议

  • 怎样用动态数组
    • 产生100个数 :chnl0 = new[100];
  • 怎样调用函数、任务
@(posedge clk);
wait(ch_ready === 'b1);
  • 数据没发送出去, 保持一拍, 到下一拍的时候, 时钟上升沿采样检查ready 是否为1, 为什么要等一个时钟下降沿? 在上升沿的时候采样 是采的0 还是 1 , 会发生竞争(delta-sycle), 就是在当前的上升沿, 监测到ready 时 只能采样到左边的值 0, 从设计的逻辑来讲, ready 的反馈 和 当前这一拍的时钟沿, 是在同一拍里面发生的 , 同一拍发生的情况, 要按组合逻辑来处理, 组合逻辑没有时钟延时这样一个关系, 组合逻辑思维是在当前上升沿 与下一个上升沿之间发生了 01转换, 这就是一个组合逻辑。

接口时钟块采样和建立保持时间关系

lab3 tb1.sv
interface clocing

  • default input #1ns output #1ns;
    人为加大 delay 后, 一目了然采样的是谁。 valid 没做延迟, 上升沿和 clk 的一样齐, 采样会竞争, 在上升沿时刻是驱动 valid , 在上升沿的前 1ns 采样准确。
    input #1ns : 在时钟上升沿前1ns 采样数据
    input 是为了做准确的采样 , output 是为了加一个明显的延迟,方便仿真时肉眼可见延迟、设计采样到这部分, 是对建立和保持时间的一个模拟, 如果在时钟的上升沿之前某一段能够采样到一个稳定的数据, 表示数据在采之前已经稳定了, 驱动一个数据,把它的保持时间模拟出来。

  • 建立时间, 在采样的时候 是模拟能不能采样到一个稳定的数据, 跟建立时间概念有关系,

  • 保持时间, 模拟这样一个稳定的周期, 在驱动时序上面 有个肉眼可见的延迟

RTL 的仿真没有任何真实的物理信息, input 在 时钟 的上升沿前采样 ; output 在时钟的上升沿之后的一段时间做驱动, 是便于做采样和做驱动的, 真正的物理保持时间不是这个样子, 真正的物理时间来源于网表,距离越远,花时间越久, 来源于 RTL 完了之后的综合 布局布线的网表 ,有时序信息了,

函数和任务的不同参数方向的区别

task / function 参数的4种方向: input , output , inout , ref

int a = 1;
int b = 0;
int c = 0;
task add( input x, input y, output z) // 输出输入不受内部影响, z =20时,外部 c = 0, 只有过了 10ns 之后 ,得到返回值时, c = 20
task add( input x, input y, ref z) //  ref 表示直接索引到 z, z 和外部的 c 是同一个值 ,此时类型的 z 类似一个指针, 当 z = 20 时, 同时刻 c = 20 ,同步变化
	#10ns;
	z = x + y;
	#10ns;
endtask
a = 10;
b = 10;
#10ns;
add(a,b,c)
 

ref :想要追踪外部变量, 外部的任何变化都会影响 task 内部的采样。 既能不断地监测到外部变量, 又能修改外部变量

const ref :既想要监测到外部的变量, 又不能修改外部变量

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值