1.感受
从前面的做题中学到了门语言、矢量,也看到了其灵活运用,我的确有眼前一亮的感觉,但这些知识点和我学的MATLAB相同,我只学会看懂代码,但怎么成为master?怎么解决问题?
比如知道了if、case,知道了加法器的原理和代码,但为何要用这些语言?我脑子里主动分析过这些语言吗。就像背单词,背了不一定会表达,因此我现在进一步直接学习4.Verification: Reading Simulations
2.正文
2.1 2-1复用器:
module top_module(
input a, b, sel,
output out );
assign out = sel ? a : b;
endmodule
2.2 源代码
module top_module (
input sel,
input [7:0] a,
input [7:0] b,
output out );
assign out = (~sel & a) | (sel & b);
endmodule
2.3 警告
- 显示输入输出大小没有匹配上,修改了[7:0] out,修改后的时序图:
- 从波形图可以看到,当
sel
为高电平时,参考输出选择a
信号(aa
),但实际输出却选择了ba
(可能是b
和a
的组合)。为什么在亚稳态时输出异常?
2.4 答案
module top_module (
input sel,
input [7:0] a,
input [7:0] b,
output [7:0] out );
assign out = sel? a : b;
endmodule
2.5 亚稳态的解释(来源豆包AI)
如果a是8位,当执行 sel & a
时,Verilog 会自动将 sel
扩展为 8 位:
- 如果
sel = 1
,扩展后为8'b11111111
- 如果
sel = 0
,扩展后为8'b00000000
亚稳态是指触发器无法在有效时间内稳定到逻辑 0 或 1 的状态。此时触发器的输出会在 0 和 1 之间震荡,最终可能稳定到任意值。
- 当
sel
处于亚稳态时(例如电压在阈值附近,既不是 0 也不是 1),硬件会将其解释为部分比特为 0,部分比特为 1。例如: sel
可能被解释为8'b01010101
(假设亚稳态导致每两位交替为 0 和 1)
因此在矢量计算中,位运算要注意参数的长度匹配