Cocotb在门级仿真中使用泛型/参数

时间:2016-12-07 10:38:18

标签: python vhdl simulation cocotb netlist

我已经为我的设计成功设置了一个Cocotb验证环境,我很高兴它适用于RTL(在我的情况下是VHDL)。

我的设计是使用泛型,我在python代码的几个地方(主要是在run_test和模型中)检索这些泛型的值,遵循模板:
my_generic = dut.GEN_NAME.value

不幸的是,这不适用于门级仿真,因为我的综合设计不再具有泛型,因此dut.GEN_NAME.value不存在。

我是否应该从模拟流程(Cocotb的makefile)获取参数/泛型值的方向?

如果是这样,最干净的方法是什么?使用env变量?

(顺便说一句,我使用Questa,即使我不希望这个方面依赖于模拟器...)

感谢您的帮助和建议......

1 个答案:

答案 0 :(得分:2)

将配置传递给Python Cocotb代码可能是可能的,但它很容易出错,因为您必须确保传递用于合成的相同值。

另一种解决方案是将顶级实体的配置包存储在单独的文件中,例如top_config.vhdl,内容为:

library ieee;
use ieee.std_logic_1164.all;

package top_config is

  constant AA : positive := 5;
  constant BB : integer := 10;

end package top_config;

此处定义的常量将用作顶级实体的泛型或直接在顶级实体中的默认值。

现在可以通过Cocotb测试平台中的一些Python代码解析包:

from re import compile as re_compile

constantRegExpStr  = r"^\s*constant\s*"   # keyword and spaces
constantRegExpStr += r"(?P<name>\w+)"     # name fo constant
constantRegExpStr += r"\s*:\s*"           # divider and spaces
constantRegExpStr += r"(?P<type>\w+)"     # type name
constantRegExpStr += r"\s*:=\s*"          # assignment and spaces
constantRegExpStr += r"(?P<value>[0-9]+)" # value
constantRegExpStr += r"\s*;"              # end of statement

constantRegExp = re_compile(constantRegExpStr)


with open("top_config.vhdl") as f:
    for line in f.readlines():
        m = constantRegExp.match(line)
        if m is not None:
            print("constant '{0}' with value '{1}'".format(m.group('name'), m.group('value')))

您可以将其添加到词典或执行其他操作,而不是打印匹配项。