4

我想扩展 Cocotb 的Endian Swapper示例,以便它还检查被测设备 (DUT) 输出的包的内容。在提供的示例代码中,生成预期输出的函数将未修改的输入事务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...

似乎在记分板的创建中缺少比较功能:

self.scoreboard = Scoreboard(dut)
self.scoreboard.add_interface(self.stream_out, self.expected_output)

在 的调用中应该有第三个参数add_interface,但是这个参数没有记录。

那么,如何指定此比较功能,以便还检查包内容?

我正在使用 QuestaSim 进行模拟,并使用make SIM=questa. 我还清理了运行之间的构建目录。

4

2 回答 2

3

如果我在使用 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是允许重新排序事务的整数

如果您提供 a compare_fn,它将在监视器接收到它时与事务一起调用,但是这是一种非常原始的机制。它不可扩展,仅出于历史原因(因此未记录)。

compare更好的方法是继承 Scoreboard 类,并根据以下原型定义自定义方法:

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

于 2016-03-02T22:01:30.013 回答
2

Endian Swapper 示例的顶层以 SystemVerilog 代码和 VHDL 代码的形式提供。如果编译选项没有指定,则默认使用verilog代码。

如果我运行:

make SIM=questa TOPLEVEL_LANG=vhdl

快速入门指南中所述,一切正常。在这种情况下,无需指定比较函数。

于 2016-03-03T07:56:28.553 回答