cocotb访问HDL实例数组信号报无对应对象问题解决方法
问题原因
Verilog中例化的模块实例数组、generate块生成的实例,在仿真器导出的层级路径中,[序号]本身就是实例名称的一部分,cocotb不会自动将这类命名聚合为Python列表对象。
同时Python语法规定,点号(.)后只能跟合法标识符,[属于语法特殊字符,因此你写self.dut.slaves[0]时,Python会先尝试获取self.dut.slaves属性——这个属性本身不存在,自然会抛出AttributeError: dut contains no object named slaves的报错,和你打印dir看到slaves[0]、slaves[1]是独立属性的现象完全吻合。
正确访问方法
方法1:直接通过字符串索引访问(推荐)
cocotb的DUT对象原生支持传入层级名字符串做索引,写法最简洁:
# 直接访问对应实例的内部信号 signal_0 = self.dut["slaves[0]"].internal_data.value signal_1 = self.dut["slaves[1]"].internal_data.value
方法2:使用getattr获取实例对象
如果需要先拿到实例句柄再多次操作,可以用Python内置getattr函数传入带方括号的完整实例名获取对象:
slave0 = getattr(self.dut, "slaves[0]") slave1 = getattr(self.dut, "slaves[1]") signal_0 = slave0.internal_data.value signal_1 = slave1.internal_data.value
批量访问实例的写法
如果实例数量较多,可以先生成实例列表,后续就可以像普通Python数组一样用索引访问:
# 例:对应RTL中slaves[1:0]的2个实例,序号0、1 slaves = [self.dut[f"slaves[{i}]"] for i in range(2)] # 后续访问示例 signal_0 = slaves[0].internal_data.value signal_1 = slaves[1].internal_data.value
内容的提问来源于stack exchange,提问作者Mostafa Rady
相关产品推荐
相关产品推荐

