2016-12-07 181 views
2

我已经成功地为我的设计设置了Cocotb验证环境,并且我很高兴它可以用于RTL(在我的情况下为VHDL)。Cocotb在门级仿真中使用泛型/参数

我的设计是使用泛型,和我检索这些仿制药在Python代码(大多在RUN_TEST和模型)的几个地方的值,模板如下:
my_generic = dut.GEN_NAME.value

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

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

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

(顺便说一句,我用奎斯塔,即使我不希望这方面是模拟器依赖...)

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

+1

通常情况下,合成器的输出看起来不像RTL。传统的方法是使用包装器:在虚拟层次层中实例化门级模型,其层次接口(VHDL实例中的实体)看起来像原始RTL。 –

回答

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'))) 

而不是打印的比赛,你可以将它添加到字典或做其他事。

+0

您提供的解决方案很有意义。不过,我有一个问题。它意味着使用我顶层的配置包来获得包的可见性。我认为这是一个潜在的问题,如果我正在使用的顶端不是设计顶级。在这种情况下,它会不会在由我的块的“更高级别”驱动的泛型值与包含驱动泛型值的包的内容之间发生冲突? – user1654361

+0

此配置包必须包含在您用于综合的RTL顶级中。门级顶层不需要该包,它无论如何都没有泛型。还是你的意思是别的? –

+0

对不起,我的解释不清楚。我的问题/恐惧是在低于设计最高水平的情况下(例如分层合成)。在这种情况下,我担心真实顶层的elab中的潜在冲突,它会实例化我的块,在程序包给出的泛型值与实例化之间。你明白我的观点了吗? – user1654361