StreamBusMonitor
是基于BusMonitor
定义的类cocotb/monitors/__init__.py
类定义的开头如下所示:
class BusMonitor(Monitor):
"""
Wrapper providing common functionality for monitoring busses
"""
_signals = []
_optional_signals = []
def __init__(self, entity, name, clock, reset=None, reset_n=None,
callback=None, event=None):
self.log = SimLog("cocotb.%s.%s" % (entity._name, name))
self.entity = entity
self.name = name
self.clock = clock
self.bus = Bus(self.entity, self.name, self._signals,
optional_signals=self._optional_signals)
self._reset = reset
self._reset_n = reset_n
Monitor.__init__(self, callback=callback, event=event)
构造函数中的"o"
是参数。这用于在将信号传递给构造函数时确定信号的全名。StreamBusMonitor
name
Bus
您可能知道,一个相当合理和常见的总线命名方案是总线协议信号名称,附加或前置一些唯一标识符,例如“i”表示输入,“o”表示输出,或“axi_m”表示 AXI 主机,等等,这正是 cocotb 假设正在发生的事情。
的信号StreamBusMonitor
被声明并覆盖BusMonitor
'_signals
和_optional_signals
值。所以这里定义的信号:
class StreamBusMonitor(BusMonitor):
"""
streaming bus monitor
"""
_signals = ["valid", "data"]
本质上"o"
附加到名称(在_
加入信号之前,总线名称是默认行为cocotb/bus.py
)以确定设计中的总线信号名称,并且设计层次结构中正确对象的句柄是entity
参数。
这是有道理的,因为声明的信号是上面的信号,而 VHDL 中的信号是:
i_valid : in std_logic;
i_data : in t_data_array(0 to BUS_WIDTH-1);
o_valid : out std_logic;
o_data : out t_data
至于通信渠道,现在有一个 gitter 渠道:
https://gitter.im/cocotb
以及 LibreCores 设置的邮件列表:
https://lists.librecores.org/listinfo/cocotb