我想扩展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')
。
重新运行测试平台后,我原本预计测试会失败,但仍然会通过:
# 62345.03ns INFO cocotb.regression regression.py:209 in handle_result Test Passed: wavedrom_test
# 62345.03ns INFO cocotb.regression regression.py:170 in tear_down Passed 33 tests (0 skipped)
# 62345.03ns INFO cocotb.regression regression.py:176 in tear_down Shutting down...
似乎在创建scoreboard:
时缺少比较功能self.scoreboard = Scoreboard(dut)
self.scoreboard.add_interface(self.stream_out, self.expected_output)
在add_interface
的调用中它应该有第三个参数,但是这个参数没有记录。
那么,如何指定此比较函数,以便检查包内容?
我正在使用QuestaSim进行模拟,并使用make SIM=questa
执行测试平台。我还清理了运行之间的构建目录。
答案 0 :(得分:4)
如果我在使用Icarus时应用以下差异,则测试会按预期失败:
diff --git a/examples/endian_swapper/hdl/endian_swapper.sv b/examples/endian_swapper/hdl/endian_swapper.sv
index 810d3b7..a85db0d 100644
--- a/examples/endian_swapper/hdl/endian_swapper.sv
+++ b/examples/endian_swapper/hdl/endian_swapper.sv
@@ -119,7 +119,7 @@ always @(posedge clk or negedge reset_n) begin
stream_out_startofpacket <= stream_in_startofpacket;
stream_out_endofpacket <= stream_in_endofpacket;
- if (!byteswapping)
+ if (byteswapping)
stream_out_data <= stream_in_data;
else
stream_out_data <= byteswap(stream_in_data);
我无法访问Questa,但我会看到VHDL模拟器上发生了什么。我的直觉是在进行更改后仔细检查您是否运行make clean
并检查Questa是否以某种方式缓存了构建的RTL库。
您是正确的,记分板的add_interface
方法有一些未记录的关键字参数:
compare_fn
可以是任何可调用函数reorder_depth
是允许重新排序交易的整数如果您提供compare_fn
,当监视器收到该事务时,它将被调用,但这是一种非常原始的机制。它不具有可扩展性,仅出于历史原因(因此没有记录)。
更好的方法是根据以下原型对Scoreboard类进行子类化并定义自定义compare
方法:
def compare(self, got, exp, log, strict_type=True):
"""
Common function for comparing two transactions.
Can be re-implemented by a subclass.
"""
其中got
和exp
是已接收和预期的事务,log
是对监视器的logger
实例的引用(用于提供更有意义的消息)。< / p>
答案 1 :(得分:2)
Endian Swapper示例的顶级提供为SystemVerilog代码以及VHDL代码。如果没有由编译选项指定,则默认使用verilog代码。
如果我跑:
make SIM=questa TOPLEVEL_LANG=vhdl
在Quick Start Guide中给出,一切都按预期工作。在这种情况下,无需指定比较函数。