我在下面写了一个简单的代码作为幅度比较器。 C的6位给出A = B,A!= B等的值;但是,当我运行代码时,我收到以下错误。我该如何解决这个错误?
c2q39.v:7: error: C['sd5] is not a valid l-value in testbench.m.
c2q39.v:3: : C['sd5] is declared here as wire.
我的代码是
module mag(A,B,C);
input [3:0] A,B;
output [5:0] C;
always @ (A or B)
assign C[5]=(A==B);
assign C[4]=(A!=B);
assign C[3]=(A>B);
assign C[2]=(A<B);
assign C[1]=(A>=B);
assign C[0]=(A<=B);
endmodule
module testbench;
reg [3:0] A,B;
wire [5:0] C;
mag m(A,B,C);
initial
begin
A=4'b0000;B=4'b0000;
#10 A=4'b1000;
#10 B=4'b1001;
#10 A=4'b1000;
end
initial
$monitor("%0d %b %b %b",$time,A,B,C);
endmodule
答案 0 :(得分:3)
在始终块中使用assign语句不是一个好主意(有关详细信息,请参阅here)。因此,您可以将输出 C 定义为reg并按以下方式实现:
module mag(A,B,C);
input [3:0] A,B;
output reg [5:0] C;
always @ (A or B)
begin
C[5]=(A==B);
C[4]=(A!=B);
C[3]=(A>B);
C[2]=(A<B);
C[1]=(A>=B);
C[0]=(A<=B);
end
endmodule
实现的另一种方法是使用assign语句。
module mag(A,B,C);
input [3:0] A,B;
output [5:0] C;
//always @ (A or B)
assign C[5]=(A==B);
assign C[4]=(A!=B);
assign C[3]=(A>B);
assign C[2]=(A<B);
assign C[1]=(A>=B);
assign C[0]=(A<=B);
endmodule