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情况,在自己写代码的时候也应该注意。
如有遗漏和错误,欢迎批评指正讨论。
练习链接