Отображение шины в Verilog

Я пишу код на Verilog, который будет считать до 15 на каждом краю часов и возвращаться к 0. Однако я не могу отображать сигналы. Все, что я вижу, это Z (высокий импеданс).

`timescale 1ns / 1ps


module Counter(
input ck,
output [3:0] a

);

reg a;

reg [3:0] i = 4'b0000;
always@(posedge ck)
begin
    a = i;

    if(i==15)
    i = 0;

    else
    i = i+1;
end

endmodule

Вот тестовый стенд для его запуска:

module Counter_tb;

wire clock;
wire [3:0] ta;

Clocker mygate(.clk(clock));

Counter mygate2(.ck(clock), .a(ta));

initial
begin
    $display(ta, clock);

end
endmodule

Осциллограмма часов отображается правильно, но не та. В чем может быть возможная ошибка?


person archity    schedule 15.10.2016    source источник
comment
Изменить $display на $monitor   -  person Karan Shah    schedule 17.10.2016
comment
Во-первых, $monitor не помогал ... это был только монитор, который везде показывал вывод Z.   -  person archity    schedule 17.10.2016


Ответы (2)


Вы объявили a дважды, один раз как 4-битный выход (предполагаемый тип провода), а один раз как внутреннюю однобитную регистрацию. То, как вы это сделали, не соответствует стандарту IEEE, потому что оно не соответствует стилю ANSI или не ANSI. Некоторые симуляторы могут разрешить то, что вы сделали, и работать правильно, другие выдают ошибки компиляции (строгое соответствие IEEE), а некоторые путаются. Я предполагаю, что последнее произошло с вашим симулятором; возможно, в вашем журнале компиляции было предупреждающее сообщение, которое вы просмотрел.

Избавьтесь от строки reg a; и измените output [3:0] a на output reg [3:0] a, чтобы сделать ее совместимой с заголовком в стиле ANSI. В стиле списка портов ANSI направление, тип, ширина и имя портов объявляются для одного и того же имени.

module Counter(
input ck,
output reg [3:0] a
);

Альтернативой является стиль, отличный от ANSI (не рекомендуется), который требует одну строку для объявления порядка портов, другую для направления и размера и необязательную дополнительную строку, чтобы сделать его reg. Надлежащий заголовок в стиле, отличном от ANSI, ниже. Заголовок в стиле, отличном от ANSI, требуется для IEEE1364-1995. ANSI был добавлен и стал рекомендуемым стилем, начиная с IEEE1364-2001, с поддержкой не-ANSI, чтобы можно было продолжать использовать устаревший код.

module Counter(ck, a);
input ck;
output [3:0] a;
reg [3:0] a;

Другое замечание: флопам следует назначать неблокирующие (<=) назначения, а не блокирующие (=) назначения. Как минимум измените a = i; на a <= i;, чтобы на практике использовать правильный стиль кодирования, который позволит избежать условий гонки в планировщике Verilog.

person Greg    schedule 17.10.2016
comment
Спасибо. Это сработало. Я приму к сведению те стандарты, которые вы упомянули. Во-первых, вывод отображается в шестнадцатеричном формате. После отображения 10 он начинается с a, b... до f. Потом опять откат в 0. В чем может быть причина? - person archity; 17.10.2016
comment
Для оператора $monitor и $display вы можете использовать выражение формата; пример $monitor("ta:%0d clk:%b", ta, clock);. См. Стандарт IEEE 1800-2012, раздел 21.2 Показать системные задачи для получения полной информации. В форме волны обычно есть возможность изменить базу с шестнадцатеричной на десятичную или двоичную и т. Д., Но это зависит от конкретного инструмента формы волны. - person Greg; 18.10.2016

Вы вызываете "$display" раз за разом 0. Что вы ожидаете увидеть? Попробуйте изменить $display на "$monitor(ta, clock);".

person Michael    schedule 16.10.2016
comment
Во-первых, $monitor не помогал ... это был только монитор, который везде показывал вывод Z. - person archity; 17.10.2016