我想扩展Cocotb的Endian Swapper示例,以便它也检查被测设备(DUT)输出的包的内容。在provided example code中,生成预期输出的model
函数将未修改的输入事务附加到预期输出列表中。此列表作为记分板的参数提供。在
为了理解记分板是如何工作的,以及model
函数为什么没有附加字节交换的事务,我在DUT中引入了一个设计错误。在endian_swapper.vhdl的以下代码块中
if (byteswapping = '0') then
stream_out_data <= stream_in_data;
else
stream_out_data <= byteswap(stream_in_data);
end if;
我刚刚将第一行中的if
条件转换为:(byteswapping /= '0')
。在
重新运行测试台后,我本以为测试会失败,但它仍然通过了:
^{pr2}$似乎在创建scoreboard时缺少比较函数:
self.scoreboard = Scoreboard(dut)
self.scoreboard.add_interface(self.stream_out, self.expected_output)
在调用add_interface
时,它应该有第三个参数,但是这个参数没有文档记录。在
那么,如何指定这个比较函数,以便检查包的内容呢?在
我使用QuestaSim进行模拟,并使用make SIM=questa
执行了测试台。我还清理了运行之间的构建目录。在
如果我在使用Icarus时应用了以下差异,则测试将如预期失败:
我没有访问Questa的权限,但我会看看在VHDL模拟器上会发生什么。我的直觉是在进行更改后再次检查您是否运行了
make clean
,并检查Questa是否以某种方式缓存了构建的RTL库。在正确的是,记分板的
add_interface
方法有一些未记录的关键字参数:compare_fn
可以是任何可调用函数reorder_depth
是一个整数,允许对事务进行重新排序然而,{supply是一个monitor}机制,当它被一个monitor}接收时,它将被一个monitor}调用。它是不可伸缩的,而且只是由于历史原因(因此没有文档记录)。在
更好的方法是将Scoreboard类子类化,并根据以下原型定义自定义
^{pr2}$compare
方法:其中
got
和exp
是已接收和预期的事务,log
是对监视器的logger
实例的引用(以提供更有意义的消息)。在Endian交换程序示例的顶层作为SystemVerilog代码和VHDL代码提供。如果不是由编译选项指定,则默认使用verilog代码。在
如果我跑:
正如在Quick Start Guide中给出的,一切都按预期工作。在这种情况下,不需要指定比较函数。在
相关问题 更多 >
编程相关推荐