路科验证V0实验lab3总结(上)

先总结实验任务的代码,再来总结一些拓展思考

任务一:创建顶层测试环境(Top-Level Test Environment)

1.编辑已存在的test.sv文件,给pkt2cmp_payload[$]序列添加一个全局声明(global-declaration),位宽为8bit(logic[7:0])。这个序列将会被用来存储来自于DUT的取样数据。

 

2.为了能够进行自我核对,修改程序使recv()和send()可以并行进行,并在其后添加一个自我核对程序check()。

 

任务二:发展一个监视器(Monitor)

1.声明一个recv()命令。

2.在recv()体中调用get_payload()来获取有效负载。(在目前这是这是recv()程序中的唯一内容,在后面的实验中我们会在添加一些内容。)

 

3.声明get_payload()任务。

 

4.在get_payload()中,删除掉pkt2cmp_payload[$]的内容。(删掉来自之前数据包的可能剩余物是十分有必要的)

5.继续在get_payload()之中,等待输出端frame信号的下降沿。

 (整个fork就一个意思:就是为了等待frame的下降沿,而为了防止等不到而一直卡在这,要做一个处理,并行触发1000次时钟,并且join_any是里面的并行语句只要有一个完成就推出继续执行下面的语句,故如果没有frame下降沿,1000次时钟触发结束就打印错误信息,frame信号超时,并结束仿真,$finish就是结束仿真,$stop是暂停仿真)

6.通过在路由器的输出端口取样来继续完善get_payload():

  a)保持循环直到frame信号被检测到。

  b)在循环中,至少8个时钟周期内聚合起一个字节(8bit)的数据。接着将每一个8位数据存储到pkt2cmp_payload[$]序列中去。

 7.如果payload没有连成一个byte,就打印错误信息并终止仿真。

问题回答:

问题1: for循环里的为什么是 i=i  不是 i++  ?

因为为了采集的数据是准确的,故这里不直接 让 i++ , 而是在循环里限制条件后再加

问题2: datum[ i++] 又是什么意思?

这里就是限制条件,等到rtr_io.cb.valido_n[da] 处于低电平时才让 i+1 并进行数据采集,保证采集的数据准确

问题3: if 条件表达式里为什么是(i==8)?

等待最后一个byte的最后一位传输成时,i++,此时 i = 8

问题4: 这里的 return 的含义?

退出整个forever循环

问题5:出现的 2个  pkt2cmp_payload.push_back(datum);  重复吗?见下面的总结

总结:

在前n-1个byte 采集中代码执行顺序为: 

因为数据没有传输完,故 frameo_n  一直处于低电平,故前面的 if 语句不会执行,每传输完一个字节都会跳出for循环顺序执行后面的语句:也就是第2个数据采集语句:

pkt2cmp_payload.push_back(datum); 

把数据采集到 pkt2cmp_payload中 。

在最后一个byte传输中,代码执行顺序为:

先进行前7位循环,

当最后一位传输完 frameo_n 会被拉高,进入到 if 条件中,执行第1个数据采集语句:

pkt2cmp_payload.push_back(datum);  

把数据采集到 pkt2cmp_payload中 ,并 return 退出整个forever 循环,根本不会执行后面的第二个相同的语句,故不会冲突。

二、构造一个可以验证路由器输出的比较器(Checker)?

任务三:发展比较器(Checker)

这一步是为了发展一个核对器从而去检查路由器的输出。

1.创建一个compare() 函数,它可以返回一个bit的值并且可以进行数据比较。

 再给自己留一个问题,这里为什么使用 ref ?

2.在compare()中,比较payload[$]序列(用来参考的数据)和pkt2cmp_payload[$]序列取样的数据)中存储的数据来验证接收到的payload是否正确。

a)如果payload[$]序列和pkt2cmp_payload[$]序列的长度不匹配的话,设置描述该错误的语句,并返回0值结束该子程序。

b)如果在payload[$]序列和pkt2cmp_payload[$]序列的数据不匹配,设置描述该错误的语句,并返回0值和结束该子程序。(你可以用“==”来直接比较两个序列)。

c)如果在payload[$]序列和pkt2cmp_payload[$]序列中的数据是完全一致的,设置描述比较成功的语句,并返回1值和结束该子程序。

function bit compare(ref string message) 
    if(payload.size() != pkt2cmp_payload.size()) begin
      message = "Payload size Mismatch:\n";
      message = { message, $sformatf("payload.size() = %0d, pkt2cmp_payload.size() = %0d\n", payload.size(), pkt2cmp_payload.size()) };
      return (0);
    end
    if(payload != pkt2cmp_payload) begin  
      message = "Payload Content Mismatch:\n";
      message = { message, $sformatf("Packet Sent:   %p\nPkt Received:   %p", payload, pkt2cmp_payload) };
      return (0);
    end
    message = "Successfully Compared";
    return(1);
endfunction: compare

3.创建check() 任务。

4.在check() 体中,声明一个string(字符串)变量和一个计数器。

5.在check() 体内,调用compare函数来核对接收到的数据。

a)如果一个错误被发现了,则打印错误信息并终止仿真。

b)如果核对是成功的,则打印一个信息来表明比较成功和查到的数据包的数量。

6.保存并关闭test.v文件。

代码如下(示例):

task check();
    string message;
    static int pkts_checked = 0;
    if(!compare(message)) begin
        $display("\n%m\n[ERROR]%t Packet #%0d %s\n" , $realtime, pkts_checked, message);
        $finish;
    end
    $display("[NOTE]%t Packet #%0d %s", $realtime, pkts_checked++, message);
endtask: check 

endprogram: test

三、运行Driver和Monitor程序,检验Checker能否正确比数 ?


任务四:编译和仿真(略)

任务五:测试所有端口

1.修改你的测试程序来随机产生sa(源地址)和da(目标地址)

2.将你的Testbench拓展到可以发送2000个数据包。

打印信息:

当 run_for_n_packets = 21;

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装:类 209 5.1 概述 209 5.2 类的成员 233 5.3 类的继承 245 三种类型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率类型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 类型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的类 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值