verilog中的错误:使用系统verilog发出警告';N位向量?
我正在使用Icarus编译器,我正在做一个MUX4:1 代码是:verilog中的错误:使用系统verilog发出警告';N位向量?,verilog,Verilog,我正在使用Icarus编译器,我正在做一个MUX4:1 代码是: module mux (in,out,select); input [3:0] in; input [1:0] select; output reg out; always@(select or in) begin if (select == 2b'00) out = in[0]; end else if (select == 2b'01) begin
module mux (in,out,select);
input [3:0] in;
input [1:0] select;
output reg out;
always@(select or in)
begin
if (select == 2b'00)
out = in[0];
end
else if (select == 2b'01)
begin
out = in[1];
end
else if (select == 2b'10)
begin
out = in[2];
end
else if (select == 2b'11)
begin
out = in[3];
end
end
endmodule
但是,我从编译器那里得到了以下信息:
问题是因为我在“if”表达式中使用位格式而不是“int”表达式吗?请尝试(使用verilog 2005或更高版本):
您的代码的问题是您正在编写
2b'00
而不是2'b00
,并且Icarus会感到困惑,认为您正在编写SystemVerilog代码,这也是不正确的。所以,要么修复你的文字,要么像Morgan所说的那样更有效地编写代码 谢谢你,摩根。但是有两个问题:“out=in[select]是什么意思?”第二个问题:“always@*”和“always@(in或select)”有什么区别?out=in[select]
表示使用select
选择用于out的in位。其他语言中的标准数组选择。表示与您的ifelse
相同,whcih也可以写成case
station。如今,手动灵敏度列表不受欢迎。因为它们可能导致RTL和合成门级模拟错误匹配。@Morgan我更喜欢always\u comb
而不是always*
。在这个例子中,两者都会起作用,但后者更安全。@NIN你可以在这里读到区别:@DawidGrabowski我同意,这是系统Verilog。不过也谢谢你dave。问题是我无法理解“out=In[select]“声明。我不知道brakets在这里是如何工作的。您可以指定一个变量索引,而不是[0]中的固定索引,它将使用select
的值作为索引。
module mux (
input [3:0] in,
input [1:0] select,
output reg out
);
always @* begin
out = in[select];
end
endmodule