https://hdlbits.01xz.net/wiki/Finding Bugs in Code答案

1.Mux

module top_module (
    input sel,
    input [7:0] a,
    input [7:0] b,
    output[7:0]out  );

    assign out = (sel)? a : b;
endmodule

这里的bug主要有两个,一是out的位宽不匹配,第二是sel&a这是错的,两者位数不同无法按位相与。
2.NAND

module top_module (input a, input b, input c, output out);//
    wire temp;
    andgate inst1 ( temp, a, b, c, 1'b1, 1'b1);
    assign out = ~temp;
endmodule

这里的问题主要是实例化时,参数没匹配,以及有参数没有实例化。二者都必须解决。
3.mux

module top_module (
    input [1:0] sel,
    input [7:0] a,
    input [7:0] b,
    input [7:0] c,
    input [7:0] d,
    output [7:0] out  ); //

    wire[7:0] mux0, mux1;
    mux2 Mux0 ( sel[0],    a,    b, mux0 );
    mux2 Mux1 ( sel[0],    c,    d, mux1 );
    mux2 Mux2 ( sel[1], mux0, mux1,  out );

endmodule

这里有三个问题,其一是wire的位宽不匹配,其二是Mux1中显然应该是(sel[0]),其三是实例化模块名与线网类型变量名重名了。
4.addsubz

// synthesis verilog_input_version verilog_2001
module top_module ( 
    input do_sub,
    input [7:0] a,
    input [7:0] b,
    output reg [7:0] out,
    output reg result_is_zero
);//
    reg[7:0] temp;
    always @(*) begin
        case (do_sub)
          0: temp = a+b;
          1: temp = a-b;
        endcase
    end
    
    always@(*)begin
    	result_is_zero = (temp==8'b0)? 1'b1 : 1'b0;
		out = temp;
    end
endmodule

这一题的问题在于,out不能在一个异步的块内既做输入有做输出,这样形成了组合闭环,产生了锁存器。
5.

module top_module (
    input [7:0] code,
    output reg [3:0] out,
    output reg valid);//

    always @(*)begin
        valid = 1'b1;
        case (code)
            8'h45: out = 4'd0;
            8'h16: out = 4'd1;
            8'h1e: out = 4'd2;
            8'h26: out = 4'd3;
            8'h25: out = 4'd4;
            8'h2e: out = 4'd5;
            8'h36: out = 4'd6;
            8'h3d: out = 4'd7;
            8'h3e: out = 4'd8;
            8'h46: out = 4'd9;
            default: begin 
                out   = 4'b0;
                valid = 1'b0;
            end
        endcase
    end
endmodule

这题有五个问题,其一valid不能直接在上面赋值1,其二是out的赋值必须要注明位数和进制数,其三是这里3的code的进制写成了d十进制应该是h十六进制,其四是这里9的code位数写成了6,其五这是组合电路要注意不能出现锁存器,所以default内必须加out的默认值(本题为0)。


这里都是常见的一些bug情况,在自己写代码的时候也应该注意。
如有遗漏和错误,欢迎批评指正讨论。
练习链接

上一篇:POJ1038 Bugs Integrated, Inc. (状压DP)


下一篇:chrome SwitchyOmega 无法代理本机