Почему я получаю эту ошибку в скобках в Verilog? - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь запустить модуль на верхнем уровне в 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 "(". 

Я неправильно выполняю инстанцирование?, спасибо!

1 Ответ

0 голосов
/ 26 апреля 2018

Есть две основные проблемы с вашим кодом, которые я вижу.Во-первых, вы создаете экземпляр модуля в блоке always.Модули всегда должны создаваться на «верхнем» уровне, то есть не в процедурном блоке, таком как always или assign, а только в теле модуля.Помните, что модули не являются функциями и не вызываются как функции, а создаются.Во-вторых, вы не можете назначать порты, используя синтаксис .port[index](var), вам нужно назначить целый порт одной переменной.Чтобы сделать то, что вы пытаетесь сделать, вам просто нужно передать переменную SW на ваш select порт 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
...