Verilog 4x16解码器输出错误数据

Verilog 4x16解码器输出错误数据,verilog,decoder,icarus,Verilog,Decoder,Icarus,我用Verilog实现了一个4x16解码器,并进行了测试。对于每种情况,解码器都应输出一个16位数字,其中只有一位高。我无法在运行程序时获得所有所需的输出。以下是解码器和测试的代码,以及控制台的输出: 4x16解码器: module Decoder4x16 (input [3:0] select, input enable, output reg [16:0] out); always @(select, enable) begin if(enable == 1'b0)

我用Verilog实现了一个4x16解码器,并进行了测试。对于每种情况,解码器都应输出一个16位数字,其中只有一位高。我无法在运行程序时获得所有所需的输出。以下是解码器和测试的代码,以及控制台的输出:

4x16解码器:

module Decoder4x16 (input [3:0] select, input enable, output reg [16:0] out);

always @(select, enable)
begin

    if(enable == 1'b0)
        out = 16'b0000000000000000;
    else if(enable == 1'b1)
        if(select == 4'b0000)
            out <= 16'b0000000000000001;
        else if(select == 4'b0001)
            out <= 16'b0000000000000010;
        else if(select == 4'b0010)
            out <= 16'b0000000000000100;
        else if(select == 4'b0011)
            out <= 16'b0000000000001000;
        else if(select == 4'b0100)
            out <= 16'b0000000000010000;
        else if(select == 4'b0101)
            out <= 16'b0000000000100000;
        else if(select == 4'b0110)
            out <= 16'b0000000001000000;
        else if(select == 4'b0111)
            out <= 16'b0000000010000000;
        else if(select == 4'b1000)
            out <= 16'b0000000100000000;
        else if(select == 4'b1001)
            out <= 16'b0000001000000000;
        else if(select == 4'b1010)
            out <= 16'b0000010000000000;
        else if(select == 4'b1011)
            out <= 16'b0000100000000000;
        else if(select == 4'b1100)
            out <= 16'b0001000000000000;
        else if(select == 4'b1101)
            out <= 16'b0010000000000000;
        else if(select == 4'b111)
            out <= 16'b0100000000000000;
        else if(select == 4'b1111)
            out <= 16'b1000000000000000;
    end

endmodule
当我运行程序时,它输出正确的输出,直到它到达输入为1101的测试用例。在此之后,解码器输出错误的值,它应该显示。以下是输出:

select = 0000    out = 00000000000000001
select = 0001    out = 00000000000000010
select = 0010    out = 00000000000000100
select = 0011    out = 00000000000001000
select = 0100    out = 00000000000010000
select = 0101    out = 00000000000100000
select = 0110    out = 00000000001000000
select = 0111    out = 00000000010000000
select = 1000    out = 00000000100000000
select = 1001    out = 00000001000000000
select = 1010    out = 00000010000000000
select = 1011    out = 00000100000000000
select = 1100    out = 00001000000000000
select = 1101    out = 00010000000000000
select = 1110    out = 00010000000000000
select = 1111    out = 01000000000000000

这里,
out
是一个
reg
,这意味着它持有一个分配给它的值。如果
select=4'b1110
的条件为
else,则不存在
else。因此,
out
保持它的先前值,该值来自
select=4'b1101
。也就是说,
out
保存显示的值
000100000000000

因此,
select=4'b1110
添加一个
else条件,代码正常工作

  else if(select == 4'b1110)
            out <= 16'b0100000000000000;
还有一件事需要详细说明,请使用
始终@(*)
而不是手动灵敏度列表。这将有助于减少敏感度列表的混乱。

试试这个简单的代码

module Decoder4x16 (input [3:0] select, 
                    input enable, 
                    output wire [16:0] out);

assign out = {17{enable}} & (1'b1 << select);

endmodule
模块解码器4x16(输入[3:0]选择,
输入使能,
输出线[16:0]输出);

赋值={17{enable}}&(1'b1)您键入了一个条件:
else if(select==4'b111)
应该是
else if(select==4'b1110)
您能解释一下吗
赋值={17{enable}&(1'b1 1被移到select输入给定的十进制位置。
  else if(select == 4'b1110)
            out = 16'b0100000000000000; // blocking
module Decoder4x16 (input [3:0] select, 
                    input enable, 
                    output wire [16:0] out);

assign out = {17{enable}} & (1'b1 << select);

endmodule