Проблема с чтением сигнала шины. Сравните с моими Modelsim DE 10.2c и 10.4. EDAplayground Modelsim 10.1d имеет другой результат

Привет всем специалистам SystemVerilog с помощью Mentor Graphic Modelsim Tool.

Я пишу задачу монитора для обработки простого события записи / чтения шины с одним PCI. Каким-то образом EDAplayground Altera Modelsim 10.1d требует дополнительного тактового цикла по неизвестной причине, в то время как мой Modelsim DE 10.2c / 10.4 этого не делает. Я хочу понять, если это правильно.

Вот пример кода записи монитора:

     @(negedge bus.MONCLK.FRAMEn);
     @(bus.MONCLK);    // EDA playground Modelsim 10.1d requires this extra clock cycle for getting data right.   It is also required for read as well. 
     address = bus.MONCLK.AD;
     if (bus.MONCLK.CBEn == IO_Write_CMD) begin
        //tran_type = PCI_WRITE;
        write = 1;      // true
        @(bus.MONCLK);
        data = bus.MONCLK.AD;
        status = 1'b1; // success
     end else begin              
        status = 1'b0; // not success
     end  

Вот пример кода чтения монитора:

    @(negedge bus.MONCLK.FRAMEn);
     @(bus.MONCLK);     // EDA playground Modelsim 10.1d requires this extra clock cycle for getting data right.   It is also required for read as well. 
     address = bus.MONCLK.AD;
     if (bus.MONCLK.CBEn == IO_Read_CMD) begin
        write = 0;      // false
        @(bus.MONCLK);
        @(bus.MONCLK);
        data = bus.MONCLK.AD;
        status = 1'b1; // success
     end else begin              
        status = 1'b0; // not success
     end          

http://www.edaplayground.com/x/7kG Пример показывает правильный результат, если у меня есть этот дополнительный тактовый цикл. Я получу data = c для чтения или записи. http://www.edaplayground.com/x/TSE Пример показывает неправильный результат, если я удаляю этот дополнительный тактовый цикл. Я получаю данные = 516 (адрес) для записи и данные = z для чтения. Но мои Modelsim 10.2c и 10.4 покажут правильный результат (data = c).

Не могли бы вы помочь мне понять эту проблему? Спасибо.

Майкл

1 ответ

Решение

Я не могу найти объяснение для состояния гонки, но я нашел два обходных пути, которые будут работать со всеми версиями.

Один из подходов заключается в использовании цикла while с часами в качестве события блокировки, а сети - в качестве условия сравнения.

  • while(bus.MONCLK.FRAMEn!=1'b0) @(bus.MONCLK);

Другой подход заключается в использовании крошечной задержки до или после @, #1 должны быть в безопасности, пока ваши часы имеют период больше единицы времени. Я не рекомендую использовать как задержку в начале, так и в трейлинге, выберите одну.

  • @(negedge bus.MONCLK.FRAMEn) #1;
  • #1 @(bus.MONCLK);
Другие вопросы по тегам