Python变量间接赋值实现及cocotb中DUT批量赋值需求咨询
Python实现间接变量赋值及Cocotb中DUT信号批量赋值方案
1. Python中是否支持间接赋值?
当然可以,分两种常见场景:
- 全局/局部变量场景:如果操作全局变量,可通过
globals()字典实现,比如:
但这种方式不推荐,容易降低代码可读性、引发变量污染问题。x = "a" globals()[x] = 2 # 等价于 a = 2 - 对象属性场景:这是更常用且规范的方式(也是你Cocotb场景需要的),用
setattr()函数实现,专门用于给对象的指定属性(以字符串形式指定名称)赋值。
2. Cocotb中批量给DUT信号赋值的正确写法
你给出的示例代码里,self.bfm.sig = 1是错误的——这里的sig只是循环中的字符串变量,Python会直接给self.bfm新增一个名为sig的属性,而非你目标中的sig_1/sig_2。
用setattr()就能解决这个问题,修正后的代码:
for sig in ["sig_1", "sig_2"]: setattr(self.bfm, sig, 1)
这个写法的核心是:setattr(self.bfm, sig, 1)会将self.bfm对象中,名字与sig字符串值一致的属性设置为1,完全符合你“通过字符串变量间接赋值”的需求。
如果需要读取这类属性,对应使用getattr(self.bfm, sig)即可。
在Cocotb中,DUT的信号、自定义BFM的属性本质都是Python对象的属性,所以setattr()/getattr()完全适用,非常适合批量遍历信号名做赋值或读取操作。
内容的提问来源于stack exchange,提问作者Somesh
相关产品推荐
相关产品推荐

