设计模块
module my_3_8(a,b,c,out);
input a;
input b;
input c;
output[7:0] out;
//always里面的赋值语句无论最后在综合时是电路还是寄存器,在verilog语句中都要赋值为reg形式
reg[7:0] out;
always@(a,b,c)begin//表示a、b、c只要有任何值发生变动,都要执行里面的语句
case({a,b,c})
3'b000:
out = 8'b00000001;
3'b001:
out = 8'b00000010;
3'b010:
out = 8'b00000100;
3'b011:
out = 8'b00001000;
3'b100:
out = 8'b00010000;
3'b101:
out = 8'b00100000;
3'b110:
out = 8'b01000000;
3'b111:
out = 8'b10000000;
default:
out = 8'b0;
endcase
end
endmodule
验证模块
`timescale 1ns/1ps
module my_3_8_tb;
reg a;
reg b;
reg c;
wire[7:0] out;//out为8位的线网型,故需要定义长度:[7:0],最左边为最高位:out[7],反之为最低位:out[0]
my_3_8 u0(
.a(a),
.b(b),
.c(c),
.out(out)
);
initial begin
a=0;b=0;c=0;
#100;
a=0;b=0;c=1;
#100;
a=0;b=1;c=0;
#100;
a=0;b=1;c=1;
#100;
a=1;b=0;c=0;
#100;
a=1;b=0;c=1;
#100;
a=1;b=1;c=0;
#100;
a=1;b=1;c=1;
#100;
$stop;
end
endmodule
输出波形
总结
教之第一课中的二选一多路器,这个模块主要有两个不同,
- 变量的位数增加,这个实验使用了8位的out变量,故在类型定义时有所不同。
- 这个实验“设计模块”中的out在综合时无论为寄存器型还是线网型,在always语句内部都要定义为寄存器reg型。虽然在这个always语句里面可以用assign语句进行替代,但使用了always语句,就要用reg型,如果替换成assign语句,就要用wire型。