推荐答案
测试一下
题目
下面verilog中哪个或者几个会生成寄存器
A always@(clk)
B always@(posedge clk)
C always@(posedge clk)
D assign reg_a=reg_b;
参考答案与知识点
参考答案
正确选项为B和C(假设C也是always@(posedge clk))。
解析:在Verilog中,寄存器(D触发器)的生成条件是在always块中明确使用边沿触发的敏感列表(posedge或negedge),且内部使用非阻塞赋值(<=)或阻塞赋值(=)但综合工具会推断为时序逻辑。具体分析每个选项:
- 选项A:always@(clk)中敏感列表只写了clk,未指定边沿,这属于电平敏感列表,综合工具会将其视为组合逻辑(或锁存器),不生成寄存器。正确的写法应该是always@(posedge clk)或always@(negedge clk)。
- 选项B:always@(posedge clk) reg_a<=reg_b; 使用了posedge clk明确指定时钟上升沿触发,非阻塞赋值,综合工具会推断为D触发器,生成寄存器。
- 选项C:与选项B完全一致(题目中B和C重复,假设C同样为posedge clk),同样生成寄存器。
- 选项D:assign reg_a=reg_b; 连续赋值,组合逻辑,不生成寄存器。
易错点:① 误以为always@(clk)能生成寄存器,实际上必须指定边沿;② 混淆非阻塞赋值与阻塞赋值,虽然都可以在时序逻辑中使用,但非阻塞赋值更常用来避免竞争;③ 连续赋值(assign)只能用于组合逻辑。
涉及知识点
- 寄存器生成条件:边沿触发always
- 敏感列表写法:posedge/negedge
- 时序逻辑与非阻塞赋值
- 组合逻辑与连续赋值assign
- 电平敏感与边沿敏感区别