结果:Verilog中always块内不正确实例化导致代码编译失败。
出发点是想试试能否在if begin end语句实现在always里面完成实例化,通过不断的调试和找错发现always块内不能够进行实例化。
原因:在 Verilog 中,模块实例化通常不能放在 always
块内部:
因为模块实例化是结构描述,而 always
块用于行为描述。
#正确的verilog
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire [15:0] sum1,sum2,sum3;
wire cout;
assign sum = cout ? {sum3,sum1} : {sum2,sum1};
add16 inst1(
.a (a[15:0] ),
.b (b[15:0] ),
.cin (1'b0 ),
.cout (cout ),
.sum (sum1 )
);
add16 inst2(
.a (a[31:16] ),
.b (b[31:16] ),
.cin (1'b0 ),
.cout ( ),
.sum (sum2 )
);
add16 inst3(
.a (a[31:16] ),
.b (b[31:16] ),
.cin (1'b1 ),
.cout ( ),
.sum (sum3 )
);
endmodule
#错误的Verilog
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire cout2choose;
add16 add_low(
.a (a[15:0]),
.b (b[15:0]),
.cin(0),
.sum(sum[15:0]),
.cout(cout2choose)
);
always@(*)begin
if(cout2choose)
begin
add16 add_1(
.a (a[31:16]),
.b (b[31:16]),
.cin(1),
.sum(sum[31:16]),
.cout()
);
end
else
begin
add16 add_2(
.a (a[31:16]),
.b (b[31:16]),
.cin(0),
.sum(sum[31:16]),
.cout()
);
end
end
endmodule