verilog - 为什么这个输出会延迟一下?
问题描述
我用 2_to_1 MUX 制作了 4_to_1 MUX。我使用always
了语法。输出延迟一个时间单位,但我不知道为什么。当我将always
4_to_1 MUX 模块的条件更改sel
为 时*
,它运行良好。为什么这行得通?
module MUX_2_to_1 (
a0,a1,sel,out);
input [3:0]a0;
input [3:0]a1;
input sel;
output reg [3:0]out;
always @(sel)
begin
if (sel == 0)
out <= a0;
else if (sel == 1)
out <= a1;
end
endmodule
*
module MUX_4_to_1(
x0,x1,x2,x3,sel,out);
input [3:0]x0;
input [3:0]x1;
input [3:0]x2;
input [3:0]x3;
input [1:0]sel;
output reg [3:0]out;
wire [3:0]w0;
wire [3:0]w1;
MUX_2_to_1 m0 (x0,x1,sel[0],w0);
MUX_2_to_1 m1 (x2,x3,sel[0],w1);
always @(sel)
begin
if(sel[1] == 0)
out <= w0;
else if (sel[1] == 1)
out <= w1;
end
endmodule
*
`timescale 100ps/1ps
module Testbench_Mux;
reg [3:0]x0;
reg [3:0]x1;
reg [3:0]x2;
reg [3:0]x3;
reg [1:0]sel;
wire [3:0]out;
MUX_4_to_1 m0 (x0,x1,x2,x3,sel,out);
initial
begin
x0 = 4'b0001; x1 = 4'b0010; x2 = 4'b0100; x3 = 4'b1000;
#0 sel = 2'b00;
#5 sel = 2'b01;
#5 sel = 2'b10;
#5 sel = 2'b11;
#5 $stop;
end
endmodule
解决方案
您没有将推荐的 Verilog 编码实践用于组合逻辑。一个问题是您使用了不完整的敏感度列表:
always @(sel)
由于在块中读取了2 个其他信号w0
和,因此它们也必须在敏感度列表中。执行此操作的详细方法是:w1
always
always @(sel or w0 or w1)
执行此操作的首选方法是使用紧凑*
语法:
always @(*)
这确保了在always
块中读取的任何信号发生任何变化时都会触发该块。
另一个问题是您应该始终对组合逻辑使用阻塞赋值。关于原因,有足够的文档。更改<=
为=
:
always @(*)
begin
if(sel[1] == 0)
out = w0;
else if (sel[1] == 1)
out = w1;
end
如果您不遵循这些建议,您将获得不希望的模拟结果。
你也应该改变你的MUX_2_to_1
模块。
推荐阅读
- java - Java program to short and count
- python - 接受负数输入并进行数据验证的温度转换器
- php - Captcha Helper Codeigniter 错误 - imagettftext(): 找不到/打开字体
- c# - 从 .net Web 应用程序运行 python 脚本文件时出错
- python - UnicodeEncodeError:“charmap”编解码器无法在位置 0 编码字符“\ufeff”:字符映射到
- influxdb - 如何遍历kapacitor tick脚本中的字符串列表
- firebase - 如何修复“Firebase 错误:数据库名称不正确”
- java - 可以分配一个静态变量,但不能在静态初始化程序中打印出来
- python - Python 正则表达式函数
- r - 如何将Shell变量引入R脚本?