Перейти к содержанию
    

Metastability и Modelsim

Имеются асинхронные обращения со стороны процессора. Требуется выделить фронт сигнала записи процессора

 

input clk;

input cpu_wen;

output reg we;

 

reg [2:0] we_reg = 3'h0;

always @(posedge clk)

we_reg <= {we_reg[1:0], !cpu_wen};

 

initial we = 1'b0;

always @(posedge clk)

we <= we_reg[2:1] == 2'b01;

 

При попадание фронта cpu_wen на фронт clk, Modelsim выдает состояние X в течение 2х тактов: ...000ХХ00..., в остальных случаях формируется, то что требуется ...0001000...

 

В регистре we_reg сигнал пробегает следующие состояния: 000 00X 0X1 X11 111 - т.е. при прохождение 3х регистров метастабильное состояние не исчезает.

 

Такой сигнал we дальше использовать не удается. Например он может вместо сброса прерывания перевести прерывание в состояние X на неограниченное время. Если его использовать как сигнал записи в регистр (память, фифо), то ни чего не запишется.

 

Как быть с этим в Моделсиме?

 

На железе тесты проходят, в функциональном моделирование тоже, а во временном моделирование тесты пройти не могут. Частота clk, по временному анализатору, имеет большой запас. Для компиляции используется Кварсус

Изменено пользователем Manfred

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеются асинхронные обращения со стороны процессора. Требуется выделить фронт сигнала записи процессора

 

При попадание фронта cpu_wen на фронт clk, Modelsim выдает состояние X в течение 2х тактов: ...000ХХ00..., в остальных случаях формируется, то что требуется ...0001000...

 

И правильно делает!

Вам надо сначала простробировать сигнал cpu_wen под clk, причем смотрите как делается CDC и все остальное делать только под clk...

 

И на симуляции сделать сигнал "сброс"...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Х возникают в этом поведенческом описании???

 

я так понимаю, что после синтеза, так как в приведенном примере Х может появится только тогда, когда входной сигнал Х или Z

 

для чистоты терминологии нужно сказать, что это не метастабильность (которая суть аналоговый процесс, не моделируемый симуляторами типа моделсима), а нарушения setup|hold описании ячейки. в каких-то случаях метастабильность является следствием этих нарушений, но вообще-то они задают больший интервал времени

 

если мы говорим про симуляцию аннотированного нетлиста, то сколько сигнал не стробируй и не заводи сбросов, в симуляторе от этого не избавишься

то есть, если я правильно понял вопрос, то нужно гуглить disable timing checks (по-моему и тут это не раз обсуждали)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И правильно делает!

Вам надо сначала простробировать сигнал cpu_wen под clk, причем смотрите как делается CDC и все остальное делать только под clk...

 

И на симуляции сделать сигнал "сброс"...

 

Он и простробирован:

we_reg <= {we_reg[1:0], !cpu_wen};

 

- используется после второго триггера. Увеличение количества регистров по входу ни чего не дает, состояние X путешествует через все эти регистры.

 

Про сброс не понял. На микросхему ни какого же сброса не подаешь. Хотелось бы только подавать внешний воздествия, а не так чтобы тест внутрь микросхемы залезал и что-то там дергал.

 

Х возникают в этом поведенческом описании???

 

я так понимаю, что после синтеза, так как в приведенном примере Х может появится только тогда, когда входной сигнал Х или Z

 

для чистоты терминологии нужно сказать, что это не метастабильность (которая суть аналоговый процесс, не моделируемый симуляторами типа моделсима), а нарушения setup|hold описании ячейки. в каких-то случаях метастабильность является следствием этих нарушений, но вообще-то они задают больший интервал времени

 

если мы говорим про симуляцию аннотированного нетлиста, то сколько сигнал не стробируй и не заводи сбросов, в симуляторе от этого не избавишься

то есть, если я правильно понял вопрос, то нужно гуглить disable timing checks (по-моему и тут это не раз обсуждали)

 

X возникает при моделировании с задаными Квартусом временными задержками.

 

На входе сигнал cpu_wen всегда имеет значение 1 или 0.

 

Ок посмотрю про disable timing checks - надеюсь это не отключит все задержки

Изменено пользователем Manfred

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

X возникает при моделировании с задаными Квартусом временными задержками.

Вы временные ограничения квартусу задавали? И это какой уровень моделирования - после синтеза или вентильного уровня, если после синтеза, то так по идее и должно быть, если cpu_wen и clk в тесте у Вас меняются одновременно. По поводу сброса - на моделировании в поведенческом уровне по умолчанию все состояния регистров будут в X и он там может крутиться, если есть обратная связь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы временные ограничения квартусу задавали? И это какой уровень моделирования - после синтеза или вентильного уровня, если после синтеза, то так по идее и должно быть, если cpu_wen и clk в тесте у Вас меняются одновременно. По поводу сброса - на моделировании в поведенческом уровне по умолчанию все состояния регистров будут в X и он там может крутиться, если есть обратная связь.

 

cpu_wen генерится в модели от частоты 60 МГц, clk - это 80 МГц. Частоты заданы в SDC файле, задержка cpu_wen задана относительно виртуальной частоты 60 МГц.

 

Сбои (отсутствие записи в ФИФО, память, регистры по причине того, что сигнал we в состоянии Х) происходят раз на ~60 записей, когда фронты совпадают на временном моделирование (Gate Level Simulation).

В фунциональном моделирование (RTL simulation) все тесты проходят, не определенное состояние X ни когда не возникает, хотя фронты совпадают также.

На железе, в тех же тестах, сбоев нет.

 

Временной анализатор показывает максимально возможную частоту clk 106 МГц.

 

Конечно хорошо, что Моделсим показывает метастабильное состояние, но он его не сбрасывает случайным образом в 0 или 1, как в реальной микросхеме, из-за этого не проходят тесты, а часть сигналов переходит в состояние X.

 

Нашел такой док http://www.altera.com/literature/hb/qts/qts_qii53001.pdf

 

Видемо он поможет

 

The following command is an example from the Quartus II Settings File (.qsf):

 

set_instance_assignment -name X_ON_VIOLATION_OPTION OFF -to \

<register_name>

 

или vsim +notimingchecks

 

в понедельник проверю

 

Спасибо yes

Изменено пользователем Manfred

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В свое время была подобная проблема. Я решил ее следующим образом: всем регистрам которые использовались чтобы сэмплировать асинхронный к внутреннему клоку сигнал я давал спец название типа префикса meta_. Затем написал скриптик на питоне который парсил sdf файл и удалял setup и холд ограничения для этих регистров. Таким образом метастабильное состояние игнорировалось для входных регистров, а для остальной схемы временные задержки были правильные. Возможно я конечно изобрел велосипед, но как-то по другому с бесплатным modelsim-ом не получалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В свое время была подобная проблема. Я решил ее следующим образом: всем регистрам которые использовались чтобы сэмплировать асинхронный к внутреннему клоку сигнал я давал спец название типа префикса meta_. Затем написал скриптик на питоне который парсил sdf файл и удалял setup и холд ограничения для этих регистров. Таким образом метастабильное состояние игнорировалось для входных регистров, а для остальной схемы временные задержки были правильные. Возможно я конечно изобрел велосипед, но как-то по другому с бесплатным modelsim-ом не получалось.

 

это нормальный метод, так делают часто (может не на питоне, а на tcl или еще чем-то, я например, люблю awk и sed)

 

нужно прописать соответствующие строчки sdf в 0 или поубирать вообще (по умолчанию в библиотеке должен быть 0, но не всегда так)

 

моделсим (да и любой другой симулятор) не имеет стандартных средств управления этим, хотя там тоже есть tcl и можно писать скрипты

 

------------------

 

это делается через set_annotated_delay (в синопсисе, ну и наверно в квартусе)

собственно, после применения этой команды в SDF и будет прописан 0

если генерация sdf делается в GUI (или вообще посторонними дядьками, что типично для ASIC-ов), то приходится править SDF текстом (питон, tcl и т.д.)

 

------------------

 

vsim +notimingchecks

 

запрещает проверки во ВСЕХ ячейках, поэтому можно пользоваться только при очень большой уверенности, что нарушений в синхронной части нет, то есть констрейны и логика правильна

 

set_instance_assignment - не знаю, по-моему все-таки set_annotated_delay, но я давненько не брал в руки шашки (квартус)

 

ну и в этом случае все-равно нужно понимать работу "синхронизатора" - то есть стробы, цепочки триггеров и т.п. - про это хватает в сети

 

 

 

 

-------------

 

как раз у себя в редакторе скрипт (tcl для синопсиса) по применению команды

 

код:

    set clock_gen_collection [get_cells "core_0/clock_gen_0/clock_gater*/CKLNQD8WP12TM1P_gater"]
    foreach_in_collection clock_gen_cell $clock_gen_collection {
        set C_pin [get_pins -of_object $clock_gen_cell -filter "pin_name == CP"]
        set D_pin [get_pins -of_object $clock_gen_cell -filter "pin_name == Q"]
        set_annotated_delay -cell 0 -from $C_pin -to $D_pin
        query_object $clock_gen_cell >> ./DRC/top/report/clock_gen_annotated_delay.list
    }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеются асинхронные обращения со стороны процессора. Требуется выделить фронт сигнала записи процессора

....

При попадание фронта cpu_wen на фронт clk, Modelsim выдает состояние X в течение 2х тактов: ...000ХХ00..., в остальных случаях формируется, то что требуется ...0001000...

....

В регистре we_reg сигнал пробегает следующие состояния: 000 00X 0X1 X11 111 - т.е. при прохождение 3х регистров метастабильное состояние не исчезает.

....

Как быть с этим в Моделсиме?

....

На железе тесты проходят, в функциональном моделирование тоже, а во временном моделирование тесты пройти не могут. Частота clk, по временному анализатору, имеет большой запас. Для компиляции используется Кварсус

 

Не прошло и полтора года ....

Как раз столкнулся с метастабильностью на реальном железе.

В функциональном моделировании не могу получить картину, как у ТС. Просьба посмотреть в архиве : что не так?

 

Metastab.qpf

# -------------------------------------------------------------------------- #
#
# Quartus II 32-bit
# Version 13.1.0 Build 162 10/23/2013 SJ Full Version
# Date created = 12:33:22  August 15, 2014
#
# -------------------------------------------------------------------------- #

QUARTUS_VERSION = "13.1"
DATE = "12:33:22  August 15, 2014"

# Revisions

PROJECT_REVISION = "Metastab"

 

Metastab.qsf

# -------------------------------------------------------------------------- #
#
# Quartus II 32-bit
# Version 13.1.0 Build 162 10/23/2013 SJ Full Version
# Date created = 12:33:22  August 15, 2014
#
# -------------------------------------------------------------------------- #
#
# Notes:
#
# 1) The default values for assignments are stored in the file:
#		Metastab_assignment_defaults.qdf
#    If this file doesn't exist, see file:
#		assignment_defaults.qdf
#
# 2) Altera recommends that you do not modify this file. This
#    file is updated automatically by the Quartus II software
#    and any changes you make may be lost or overwritten.
#
# -------------------------------------------------------------------------- #


set_global_assignment -name FAMILY "MAX II"
set_global_assignment -name DEVICE EPM1270T144I5
set_global_assignment -name TOP_LEVEL_ENTITY mst
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1
set_global_assignment -name PROJECT_CREATION_TIME_DATE "12:33:22  AUGUST 15, 2014"
set_global_assignment -name LAST_QUARTUS_VERSION 13.1
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name MIN_CORE_JUNCTION_TEMP "-40"
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 100
set_global_assignment -name DEVICE_FILTER_PACKAGE TQFP
set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144
set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 5
set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR "-1"
set_global_assignment -name POWER_EXT_SUPPLY_VOLTAGE_TO_REGULATOR 3.3V
set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (Verilog)"
set_global_assignment -name EDA_RUN_TOOL_AUTOMATICALLY ON -section_id eda_simulation
set_global_assignment -name EDA_OUTPUT_DATA_FORMAT "VERILOG HDL" -section_id eda_simulation
set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation
set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "NO HEAT SINK WITH STILL AIR"
set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation
set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH tmst -section_id eda_simulation
set_global_assignment -name EDA_TEST_BENCH_NAME tmst -section_id eda_simulation
set_global_assignment -name EDA_DESIGN_INSTANCE_NAME NA -section_id tmst
set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME tmst -section_id tmst
set_global_assignment -name EDA_NATIVELINK_SIMULATION_SETUP_SCRIPT work_mst.do -section_id eda_simulation
set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"
set_location_assignment PIN_4 -to cpu_wen
set_location_assignment PIN_5 -to we
set_location_assignment PIN_18 -to clk
set_global_assignment -name SDC_FILE mst.sdc
set_global_assignment -name VERILOG_FILE mst.v
set_global_assignment -name VERILOG_FILE tmst.v
set_global_assignment -name EDA_TEST_BENCH_FILE tmst.v -section_id tmst
set_global_assignment -name USE_CONFIGURATION_DEVICE ON
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH WEAK PULL-UP"
set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON

 

mst.v

module mst (input clk, input cpu_wen, output reg we); // metastability

reg [2:0] we_reg = 3'h0;
always @(posedge clk)
we_reg <= {we_reg[1:0], !cpu_wen};

initial we = 1'b0;
always @(posedge clk)
we <= we_reg[2:1] == 2'b01;

endmodule

 

tmst.v

`define CLK_HALF_PERIOD 1
`define CPU_WE_HALF_PERIOD 6
`define START_SIM 3
`timescale 1us / 100ns

module tmst; // test mst
reg clk, cpu_wen;
wire we;

mst mst_inst(.clk(clk), .cpu_wen(cpu_wen), .we(we));

initial begin
   clk = 0;
   cpu_wen = 1;
end

initial begin
   #`START_SIM
   forever #`CLK_HALF_PERIOD clk = !clk;
end    

initial begin
   #`START_SIM
   forever #`CPU_WE_HALF_PERIOD cpu_wen = !cpu_wen;
end 

endmodule //tmst 

 

mst.sdc

#**************************************************************
# Time Information
#**************************************************************

set_time_format -unit ns -decimal_places 3

#**************************************************************
# Create Clock
#**************************************************************

create_clock -name {clk} -period 12.500 [get_ports {clk}]
create_clock -name {clk60MHz} -period 16.666
derive_pll_clocks

#**************************************************************
# Set Clock Uncertainty
#**************************************************************

#derive_clock_uncertainty // unsupported

#**************************************************************
# Set Input Delay
#**************************************************************

set_input_delay -clock { clk60MHz } -min 0.0 [get_ports {cpu_wen}]
set_input_delay -clock { clk60MHz } -max 0.0 [get_ports {cpu_wen}]


#**************************************************************
# Set False Path
#**************************************************************

set_false_path -from [get_pins -compatibility_mode *] -to [get_ports {we}]

 

work_mst.do

add wave -divider "tmst"
add wave sim:/tmst/*

add wave -divider "mst_inst"
add wave sim:/tmst/mst_inst/*

run 20us 

view wave -title "monitor" -undock -x 1920 -y 0 -width 1280 -height 900
wave zoom full

 

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...