推荐答案
测试一下
题目
以下verilog语句:
A、addr的值
B、mem_array[addr]的值
C、mem_array[addr]的值以及addr的值
D、都不敏感
参考答案与知识点
参考答案
正确选项:C。解析:Verilog 中 always @(敏感列表) 的敏感列表可以是任意表达式,表达式中出现的所有信号都会成为敏感信号。此处敏感列表为 mem_array[addr],该表达式包含两个变量:addr 和 mem_array(注意 mem_array 是一个数组,但表达式 mem_array[addr] 的取值依赖于 addr 和数组元素 mem_array[addr] 的值)。因此,当 addr 变化时(导致索引改变)或 mem_array[addr] 本身的值变化时,表达式都会更新,从而触发 always 块。data 通过阻塞赋值获取 mem_array[addr] 的值,所以 data 的最终取值同时受 addr 和 mem_array[addr] 影响。选项 A 和 B 都只描述了部分因素,C 正确。选项 D 显然错误。易错点:部分考生可能误认为敏感列表只对 mem_array[addr] 这个元素值敏感,而忽略 addr 变化导致的索引改变也会触发;或者混淆“敏感列表”与“赋值依赖”的概念。另外,这种写法在实际 RTL 设计中很少使用,因为综合工具通常不支持数组元素作为敏感列表(会导致不可综合或产生锁存器),标准推荐使用 always @(*) 或显式列出所有输入信号。
涉及知识点
- Verilog敏感列表的构成规则
- 表达式作为敏感列表的语义
- 阻塞赋值与组合逻辑建模
- 数组索引在敏感列表中的隐含敏感
- 不可综合的常见写法
- 锁存器的产生与避免