如何在Cocotb中指定记分板的比较功能?

时间:2016-03-02 15:55:14

标签: python vhdl verification cocotb

我想扩展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执行测试平台。我还清理了运行之间的构建目录。

2 个答案:

答案 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.
    """

其中gotexp是已接收和预期的事务,log是对监视器的logger实例的引用(用于提供更有意义的消息)。< / p>

答案 1 :(得分:2)

Endian Swapper示例的顶级提供为SystemVerilog代码以及VHDL代码。如果没有由编译选项指定,则默认使用verilog代码。

如果我跑:

make SIM=questa TOPLEVEL_LANG=vhdl

Quick Start Guide中给出,一切都按预期工作。在这种情况下,无需指定比较函数。