Инкрементатор Verilog ожидает, что 12 бит получили 1 - PullRequest
0 голосов
/ 09 октября 2019

Цель состоит в том, чтобы использовать ALU и регистр с разрешением и сбросом для увеличения 12-битного числа на 2.

Основная проблема заключается в том, что на моем Q должно быть выходное значение инкрементора, который я получаюошибка

"incrementor_tb.v: 14: предупреждение: порт 7 (Q) инкрементора ожидает 12 бит, получил 1. incrementor_tb.v: 14 :: заполнение 11 старших бит порта."

В дополнение к этому это не работает, я просто получаю X, когда пытаюсь показать свой Q.

Имейте в виду, я понятия не имею, что я делаю. Так что, может быть, много ошибок. Главное, что я не могу понять, это то, почему, когда я подключаю Q к выходу f alu, который должен быть суммой входов a и b (оба из которых 12-битные), я получаю 1-битный ответ. Алу я тестировал и все работает. Реестр тоже должен работать.

У меня есть основания полагать, что способ установки параметров выбора и значение b в моем alu могут быть неправильными. Я попытался передать биты непосредственно в s в alu в его инстанции в инкременторе, например .s(3'b000), но это не сработало, и я не был уверен, было ли это разрешено, поэтому я изменил его на то, что имею сейчас, и все еще получаюОшибка.

Вот файлы:

//12 bit alu
module alu(
    input [11:0] a, 
    input [11:0] b, 
    input [2:0] s,

    output [11:0] f,
    output take_branch,
    output ovf
    );

    reg [11:0] f;
    reg take_branch;
    reg ovf;


    always @(s, a, b)
        case(s)
            3'b000: begin // was add a and b
                take_branch = 0;
                f = a + b;
                ovf = (a[7] & b[7] & ~f[7]) | (~a[7] & ~b[7] & f[7]);
                end
            3'b001: begin //was bitwise inverse

                take_branch = 0;
                f = ~b;
                ovf = 0;
                end
            3'b010: begin //bitwise and of a and b

                take_branch = 0;
                f = a & b;
                ovf = 0;
                end
            3'b011: begin //bitwise or of a and b

                take_branch = 0;
                f = a | b;
                ovf = 0;
                end
            3'b100: begin //arithmetic shift right

                take_branch = 0;
                f = a >>> 1;
                ovf = 0;
                end
            3'b101: begin //logical shift left

                take_branch = 0;
                f = a << 1;
                ovf = 0;
                end
            3'b110: begin //branch if equal
                take_branch = (a == b);
                f = 0;
                ovf = 0;
                end
            3'b111: begin //branch not equal
                take_branch = (a != b);
                f = 0;
                ovf = 0;
                end
            default: begin
                take_branch = 0;
                f = 0;
                ovf = 0;
                end
        endcase
endmodule

Регистрация

// 12 bit registyer with enable

module register (
input clk,
input reset,
input en,
input [11:0] d,
output [11:0] out
);

reg out;

//async reset, synchronoyus enable

always @ (negedge clk, negedge reset)
    if (reset) out <= 12'b000000000000;
    else if (en) out <= d;
endmodule

инкремент

//increment by 2
module incrementor(baseNumber, clk, clear, inc, sel, incBy, Q);

input [11:0] baseNumber;
input clk;
input clear;
input inc;

input [2:0] sel;
input [11:0] incBy;

output [11:0] Q;

wire [11:0] reg_out;
//wire [11:0] Q;
//reg ovf;


//instantiate alu
alu myalu (
    .a(reg_out), //in to out
    .b(incBy),
    .s(sel),
    .f(Q),
    .take_branch(),
    .ovf()
);
//instantiate register
register myregister (
    .clk(clk),
    .reset(clear),
    .en(inc),
    .d(baseNumber),
    .out(reg_out)
);
//assign q behavior
//assign q = q;

endmodule

и, наконец, файл тестового стенда

module incrementor_tb();
    reg [11:0] baseNumber;
    reg clear;
    reg clk;
    reg inc;

    parameter [2:0] sel = 000;
    parameter [11:0] incBy = 12'b000000000010;


    wire Q;

    incrementor uut (
        .baseNumber(baseNumber),
        .clk(clk),
        .clear(clear),
        .inc(inc),
        .sel(sel),
        .incBy(incBy),
        .Q(Q)
        );

     initial 
        begin
        clk=1'b0;
        repeat (20)
        #5 clk = ~clk;  
     end 

    initial
        begin
        #0 clear = 1'b1;
        baseNumber = 12'b000000000001; 
        inc = 1'b1;
        clear = 0;
        $display(Q);
        #100 clear = 1'b0;
    end
    initial 
        $monitor("time = %0d: Q = %1h", $time, Q);
endmodule
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...