2016-12-07 32 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