Вы говорите, что симуляция на Modelsim «работает правильно», но не указывайте, как вы определяете «правильно». Я имитировал его, и ничего интересного не происходит вообще: cnt
остается на 4'bx
, потому что у вас нет механизма для его инициализации. Я бы предположил, что вы намереваетесь cnt
для увеличения на каждом переднем фронте sig
. Это происходит, если вы инициализируете cnt
(см закомментированы код):
https://www.edaplayground.com/x/4zXf
Однако, в то время как этот код может быть синтезирован, это не синхронным дизайна, и поэтому он синтезирует глупость (сумматор и четыре защелки). Предполагая, что вы действительно требуют cnt
прирастить на каждом нарастающем фронте sig
, вы должны увеличивать эту конструкцию синхронно:
always @(posedge sig)
cnt <= cnt + 1;
Это синтезируют в сумматор и четырех D-типа флип-флоп.
Нормально сбросить счетчик, поскольку в противном случае в реальном оборудовании счетчик будет иметь неизвестное значение (отсюда 4'bx
в симуляции). Вы можете уйти с инициализацией cnt
в FPGA:
reg [3:0] cnt = 4'b0;
но вы можете рассмотреть сигнал сброса вместо:
always @(posedge sig, posedge reset)
if(reset)
cnt <= 4'b0; // or some other reset value
else
cnt <= cnt + 1;
Я обеспокоен ваше наименование sig
; большинство людей назвали бы это clk
или clock
или что-то подобное. Это название говорит о том, что вы, возможно, не знакомы с синхронным дизайном. Если это так, вы должны узнать об этом, а также прочитать этот ответ here.