为什么我在Verilog中遇到这个括号错误?

为什么我在Verilog中遇到这个括号错误?,verilog,Verilog,我正试图在Verilog(初学者)中启动一个顶级模块。 以下是顶级代码: module top( //////////// SEG7 ////////// output [7:0] HEX0, output [7:0] HEX1, output [7:0] HEX2, output [7:0] HEX3, output [7:0] HEX4, o

我正试图在Verilog(初学者)中启动一个顶级模块。 以下是顶级代码:

module top(

//////////// SEG7 //////////
output           [7:0]      HEX0,
output           [7:0]      HEX1,
output           [7:0]      HEX2,
output           [7:0]      HEX3,
output           [7:0]      HEX4,
output           [7:0]      HEX5,

//////////// LED //////////
output           [9:0]      LEDR,

//////////// SW //////////
input            [1:0]      SW);
always@(SW) begin



testgen test(.select[1](SW[1]), .select[0](SW[0]), data0[3:0], data1    [3:0], data2[3:0], data2[3:0]);



end

endmodule
下面是testgen(我正在尝试启动的模块

module testgen (
input      [1:0] select,
output reg [3:0] data0,
output reg [3:0] data1,
output reg [3:0] data2,
output reg [3:0] data3
);

always @(*) begin
  case (select)
     2'b00: begin
        data0 = 4'b0011;    // 3
        data1 = 4'b0010;    // 2
        data2 = 4'b0001;    // 1
        data3 = 4'b0000;    // 0
     end
     2'b01: begin
        data0 = 4'b1010;    // A
        data1 = 4'b1100;    // C
        data2 = 4'b1110;    // E
        data3 = 4'b1111;    // F
     end
     2'b10: begin
        data0 = 4'b0111;    // 7
        data1 = 4'b0001;    // 1
        data2 = 4'b0000;    // 0
        data3 = 4'b1010;    // A
     end
     2'b11: begin
        data0 = 4'b0101;    // 5
        data1 = 4'b1111;    // F
        data2 = 4'b1100;    // C
        data3 = 4'b0010;    // 2
     end
     default: begin
        data0 = 4'b0000;    // 0 should never be selected
        data1 = 4'b0000;    // 0 should never be selected
        data2 = 4'b0000;    // 0 should never be selected
        data3 = 4'b0000;    // 0 should never be selected
     end
  endcase
end

endmodule
我想在顶层加入一些其他模块,但我只想知道为什么会出现以下错误

Error (10170): Verilog HDL syntax error at top.v(29) near text: "[";    expecting "(". 

我实例化不正确吗?为什么会发生这种情况?第29行是我实例化testgen的那一行。非常感谢您的帮助!

我看到您的代码有两个主要问题。首先,您在
始终
块中实例化模块。模块应该始终在“顶部”上实例化级别,即不在像
始终
分配
这样的程序块中,而只是在模块的主体中。请记住,模块不是函数,也不是像函数一样被调用,而是实例化的。其次,您不能使用
.port[index](var)分配端口
语法,您需要将整个端口分配给单个变量。要执行您尝试执行的操作,您只需将
SW
变量传递给
select
port of
testgen
即可(同样,对所有变量使用该显式分配):


我可以看到您的代码有两个主要问题。首先,您在
始终
块中实例化模块。模块应始终在“顶部”上实例化级别,即不在像
始终
分配
这样的程序块中,而只是在模块的主体中。请记住,模块不是函数,也不是像函数一样被调用,而是实例化的。其次,您不能使用
.port[index](var)分配端口
语法,您需要将整个端口分配给单个变量。要执行您尝试执行的操作,您只需将
SW
变量传递给
select
port of
testgen
即可(同样,对所有变量使用该显式分配):

testgen test(.select(SW), // Just connect these directly, will connect SW[0] to select[0], SW[1] to select[1]
             .data0(data0), // Use .port explicit connection for all variables
             .data1(data1), // Minor issue, the code you provided doesnt define data0-data2 in the top module, be careful of implicit declaration
             .data2(data2), // Use "`default_nettype none" to avoid these issues
             .data3(data2)); // You use data2 here and not data3, its unclear if that was intentional