使用systemverilog验证仲裁器模块

本节重点介绍仲裁器在设计中的作用,包括时序和逻辑功能。

然后描述用来验证系统中仲裁器模块的SystemVerilog Testbench。

$VCS_HOME/doc/examples/testbench/sv/tutorial/arb

01 仲裁器时序图

仲裁器实现了两个CPU之间的仲裁算法(round-robin)。每个CPU都可以驱动请求输入信号(request[0] 或者request[1])。 仲裁器对请求进行排队并确定哪个CPU的请求将获得对系统总线的访问权限。 仲裁者通过一个输出信号(grant[0]或者grant[1])进行仲裁。 CPU完成操作后会取消其request信号,并在随后的时钟周期,仲裁器解除其grant信号。 在所有grant信号被解除的情况下,仲裁器可以继续仲裁下一个请求

02 仲裁器RTL代码

•testbench 顶层如下:

Test\_top顶层实例化DUT和SystemVerilog测试平台,并生成DUT和测试平台共同的时钟。示意图如下:

03测试平台文件

测试平台文件如下:

首先,验证仲裁器的reset。 然后,验证仲裁器是否能够处理简单的请求,并置位其中一个的CPU的grant信号。 最后,检查仲裁器是否正确处理了请求序列。

所有的信号操作都发生在指定的时钟边沿

expect运算符用于检查预期行为。

例如:

e1:expect(@(posedge clk##[1:3] xyz);

将在1到3个时钟周期内检查xyz是否被置位。

如果信号值与指定值相同,则进行仿真继续。 如果存在mismatch,则在用户定义的错误消息中将被打印。

04 编译和运行脚本

•编译和运行脚本如下:

change simv -> ./simv

我们 make all 就可以执行所有仿真case

本文转载自公众号:芯片数字实验室
原文链接:https://mp.weixin.qq.com/s/hVE1XmROgStMrcC3TbcZNw
未经作者同意,请勿转载!

推荐阅读

  • 多时钟域的设计和综合技巧  (一)
  • 多时钟域的设计和综合技巧(二)& (三)
  • 多时钟域的设计和综合技巧(四)

想了解更多内容,欢迎关注芯片数字实验室专栏,由于工具,你可以专注在更重要的事情上。

发表评论

邮箱地址不会被公开。 必填项已用*标注