ошибки в компиляции ModelSIM Verilog

Я разрабатываю детектор 8-битной последовательности. Но следующий код дает мне ошибку при компиляции в modelsim

- Модуль компиляции SEQDET ** Ошибка: F: \ Modeltech_pe_edu_10.4a \ examples \ avlsihw5.v (30): обнаружен начальный / конечный блок с пустым телом. Это разрешено в SystemVerilog, но не разрешено в Verilog. Обратите внимание на случайные точки с запятой. ** Ошибка: (vlog-13069) ** при анализе расширения макроса: 'A', начиная с F: \ Modeltech_pe_edu_10.4a \ examples \ avlsihw5.v (43) ** в F: \ Modeltech_pe_edu_10.4a \ examples \ avlsihw5. v (43): рядом с ";": синтаксическая ошибка, неожиданный ';', ожидает ':'.

** Ошибка: F: \ Modeltech_pe_edu_10.4a \ examples \ avlsihw5.v (46): (vlog-13205) Синтаксическая ошибка обнаружена в области, следующей за shiftReg. Есть ли пропущенный "::"?

Код Verilog:

module seq_det;
    wire SEQ_DETECTED;
    reg [0:7] latch;
    wire RST_N, SCK;
    reg SCK,SDI;
SEQDET s1(SEQ_DETECTED,latch,RST_N,SDI,SCK);
clkGen #(10) cg(SCK);
//TEST at(latch,RST_N,SDI,SEQ_DETECTED,SCK);
endmodule

module SEQDET(.SEQ_DETECTED(SEQ_DETECTED),.latch(PATTERN),.RST_N(RST_N),.SDI(SDI),.SCK(SCK));
    `define A 3'b000;
    `define B 3'b001;
    `define C 3'b100;
    reg [7:0] shiftReg;
    output SEQ_DETECTED;
    input PATTERN;
    input RST_N, SDI, SCK;
    wire SEQ_DETECTED;
    reg [2:0] state;
    reg RST_N, SDI;
    integer count, match;

    initial begin
        match = 0;
        count = 0;
        shiftReg = 8'b00000000;
        RST_N = 1;
        SEQ_DETECTED = 0;
        state = `A;
    end

    always @(negedge RST_N) begin
        PATTERN = {8{1'b0}};
        SEQ_DETECTED = 0;
        count = 0;
        match = 0;
    end

    always @(posedge SCK)
       if ( SCK && RST_N)
            case (state)
       `A : //begin
            while(count <= 8) begin
               shiftReg <= shiftReg | SDI ;
               shiftReg = shiftReg >> 1;
               count = count + 1;
               if(count === 8)
                   if(shiftReg === PATTERN)
                         match = 1;            
                   else
                         match = 0;
               else ; end
            state <= match ? `B : `C ;
            //end
      `B : //begin
           count = 0;
           match = 0;
           shiftReg = {8{1'b0}};
           SEQ_DETECTED = 1;
           #20 SEQ_DETECTED = 0;
           state <= `A ;
           //end
      `C : //begin
           count = 0;
           match = 0;
           shiftReg = {8{1'b0}};
           state <= `A ;
           //end
 endcase
 endmodule

module clkGen(SCK);
    output SCK;
    parameter period = 10;
    reg SCK;
    initial SCK = 0;
    always
        #(period/2) SCK = ~SCK;
endmodule

person Vyankatesh Gupta    schedule 14.03.2016    source источник


Ответы (2)


Ошибки,
1. Вы не можете объявить две переменные с одинаковым именем, например, wire и reg CLK.
2. Нет необходимости связывать или подключать экземпляр модуля, например, модуль SEQDET (.SEQ_DETECTED (SEQ_DETECTED) ,. latch ( PATTERN), RST_N (RST_N), SDI (SDI), SCK (SCK));
3. Подключенный модуль подключен проводом, поэтому вы не можете подключиться к reg, это должен быть входной провод RST_N, SDI , SCK; только
4. оператор case, синтаксическая ошибка, например, else; конец, это должно быть

      if(count === 8)
           if(shiftReg === PATTERN)
                 match = 1;            
           else
                 match = 0;
       else
    end
    state <= match ? B : C ;
  1. и т.д., пожалуйста, удалите ошибки компиляции, проверьте использование ‹= и = в блоках always
person Prakash Darji    schedule 14.03.2016

Тогда получаемая вами ошибка, скорее всего, связана с точкой с запятой после операторов `define. `define как буквальные замены. Когда ты говоришь

case (state)
  `A : begin // <-- appears legal syntax
    ...

ты получаешь :

case (state)
  3'b000; : begin // <-- illegal syntax
    ...

Измените `define A 3'b000; на `define A 3'b000, тогда вы получите правильный синтаксис.

Вы делаете заголовок модуля необычным способом. Модуль, порты которого объявлены с помощью .port_identifier(port_expression), технически допустим, но редко используется в заголовке; он обычно используется при подключении цепей к экземпляру модуля. Большинство людей пишут там порты заголовков модулей, отличных от ANSI, только с port_expression, отбрасывая .port_identifier(). Я рекомендую использовать заголовок в стиле ANSI (если вы не обязаны соблюдать строгий стиль кодирования 1995 года).

module SEQDET(.SEQ_DETECTED(SEQ_DETECTED),.latch(PATTERN),.RST_N(RST_N),.SDI(SDI),.SCK(SCK));
    `define A 3'b000; // <---do not use semicolons here
    `define B 3'b001; // <-+ here
    `define C 3'b100; // <-+ and here
    reg [7:0] shiftReg;
    output SEQ_DETECTED;
    input PATTERN; // <-- Are you sure you want this as a single bit?
    input RST_N, SDI, SCK;
    wire SEQ_DETECTED;
    reg [2:0] state;
    reg RST_N, SDI;
    integer count, match;

Лучше было бы написать так:

module SEQDET(
  output reg SEQ_DETECTED, // <-- based on ussage, this needs to be an reg type
  input [7:0] PATTERN, // <-- I'm guessing you meant 8-bits
  input RST_N, SDI,SCK
);
  `define A 3'b000
  `define B 3'b001
  `define C 3'b100
  reg [7:0] shiftReg;
  reg [2:0] state;
  integer count, match;

Чтобы быть синтезируемыми, always @(negedge RST_N) и always @(posedge SCK) должны быть объединены в один always @(posedge SCK or negedge RST_N)

Настоятельно рекомендуется использовать неблокирующие назначения (<=) при назначении флопов.

Задержки (например, #20) не являются синтетическими. Вы должны создать дополнительное состояние.

person Greg    schedule 14.03.2016