Проблема с чтением сигнала шины. Сравните с моими 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);