ошибки iverilog, вероятно, вызванные неправильными типами переменных

Я новичок в программировании на Verilog и работаю над реализацией 8-битного беззнакового компаратора величин, используя 2 4-битных компаратора. Я считаю, что мой код реализован правильно, однако я получаю ошибки, которые, как я полагаю, связаны с неправильным присвоением типа переменной. Поскольку я новичок в этом языке, я считаю это возможностью обучения, однако я не могу найти достаточно подходящего материала, чтобы найти решение. Если бы кто-нибудь мог объяснить, почему типы, которые я использую, неверны (или если это другая проблема, с которой я сталкиваюсь), это было бы очень признательно.

РЕДАКТИРОВАТЬ: я изменил свой ответ на предложенный, с созданием экземпляра модуля за пределами всегда блока и проводами как eq, gt и lt, но все еще получаю ошибки. Обновил код ошибки.

module MagComp4Bit (input [3:0] a, input [3:0] b, output eq, output gt, output lt);

    assign eq = a==b;
    assign gt = a>b;
    assign lt = a<b;

endmodule

module MagComp8Bit (input [7:0] a, input [7:0] b, output eq, output gt, output lt);

    reg eq0, gt0, lt0, eq1, gt1, lt1;

    MagComp4Bit comp1(a[3:0], b[3:0], eq0, gt0, lt0);
    MagComp4Bit comp2(a[7:4], b[7:4], eq1, gt1, lt1);
    always @(a, b)
    begin


            if (eq1) begin
                    eq = eq0? 1 : 0;
                    gt = gt0? 1 : 0;
                    lt = lt0? 1 : 0;
            end
            else begin
                    gt = gt1? 1 : 0;
                    lt = lt1? 1 : 0;
            end
    end
endmodule

module TestComparator;
    reg[7:0] a, b;
    wire eq, gt, lt;

    MagComp8Bit compare(a, b, eq, gt, lt);

    initial begin
            $moniter("%d a=%b, b=%b, eq=%b, gt=%b, lt=%b",
                    $time, a, b, eq, gt, lt);

            #10     a = 2;
                    b = 5;
    end
endmodule

сообщение об ошибке:

hw1p1.v:13: error: reg eq0; cannot be driven by primitives or continuous 
assignment.
hw1p1.v:13: error: Output port expression must support continuous 
assignment.
hw1p1.v:13:      : Port 3 (eq) of MagComp4Bit is connected to eq0
hw1p1.v:13: error: reg gt0; cannot be driven by primitives or continuous 
assignment.
hw1p1.v:13: error: Output port expression must support continuous 
assignment.
hw1p1.v:13:      : Port 4 (gt) of MagComp4Bit is connected to gt0
hw1p1.v:13: error: reg lt0; cannot be driven by primitives or continuous 
assignment.
hw1p1.v:13: error: Output port expression must support continuous 
assignment.
hw1p1.v:13:      : Port 5 (lt) of MagComp4Bit is connected to lt0
hw1p1.v:14: error: reg eq1; cannot be driven by primitives or continuous 
assignment.
hw1p1.v:14: error: Output port expression must support continuous 
assignment.
hw1p1.v:14:      : Port 3 (eq) of MagComp4Bit is connected to eq1
hw1p1.v:14: error: reg gt1; cannot be driven by primitives or continuous 
assignment.
hw1p1.v:14: error: Output port expression must support continuous 
assignment.
hw1p1.v:14:      : Port 4 (gt) of MagComp4Bit is connected to gt1
hw1p1.v:14: error: reg lt1; cannot be driven by primitives or continuous 
assignment.
hw1p1.v:14: error: Output port expression must support continuous 
assignment.
hw1p1.v:14:      : Port 5 (lt) of MagComp4Bit is connected to lt1
hw1p1.v:22: error: eq is not a valid l-value in TestComparator.compare.
hw1p1.v:9:      : eq is declared here as wire.
hw1p1.v:23: error: gt is not a valid l-value in TestComparator.compare.
hw1p1.v:9:      : gt is declared here as wire.
hw1p1.v:24: error: lt is not a valid l-value in TestComparator.compare.
hw1p1.v:9:      : lt is declared here as wire.
hw1p1.v:27: error: gt is not a valid l-value in TestComparator.compare.
hw1p1.v:9:      : gt is declared here as wire.
hw1p1.v:28: error: lt is not a valid l-value in TestComparator.compare.
hw1p1.v:9:      : lt is declared here as wire.
17 error(s) during elaboration.

(P.S. Я знаю, что включать тестовый стенд с другими модулями неправильно, но мне легче учиться, когда я вижу все это сразу.)


person mkohler    schedule 26.09.2018    source источник


Ответы (2)


Модули Verilog не предназначены для создания экземпляров внутри начальных или всегда блоков. Вот почему вы должны двигаться:

MagComp4Bit(a[3:0], b[3:0], eq0, gt0, lt0);
MagComp4Bit(a[7:4], b[7:4], eq1, gt1, lt1);

вне блока always. Более того, eq, gt, lt должны быть объявлены как провода в вашем модуле TestComparator.

person Qiu    schedule 26.09.2018
comment
Сделал эти изменения и все еще получаю некоторые подобные ошибки. - person mkohler; 26.09.2018

Тип wire не может быть назначен ни в одном процедурном блоке (всегда, начальный, ..). Вы делаете это внутри always

always...  
    .. 
    eq = eq0? 1 : 0;

где eq определяется как порт без какого-либо типа данных, что означает wire по умолчанию. то же самое с двумя другими портами: lt и gt.

Вам нужно немного изменить код:

reg eqReg, ltReg, wrReg;

always @(a, b)
    begin

        if (eq1) begin
                eqReg = eq0? 1 : 0;
                gtReg = gt0? 1 : 0;
                ltReg = lt0? 1 : 0;
        end
        else begin
                gtReg = gt1? 1 : 0;
                ltReg = lt1? 1 : 0;
        end
end
assign eq = eqReg;
assign lt = ltReg;
assign gt = gtReg;
person Serge    schedule 26.09.2018