Я сделал поведенческое моделирование своего кода, и он отлично работает. Результаты прогнозируются. Когда я синтезирую свой код и загружаю его в spartan 3e FPGA и пытаюсь анализировать с помощью chipcope, результаты даже не приближаются к тому, что я ожидал. Что я сделал неправильно? http://pastebin.com/XWMekL7rКод Verilog имитирует, но не работает, как прогнозировалось на FPGA
ответ
Ваша проблема с линиями 13-16, где вы установили начальные значения для государственных регистров:
reg [OUTPUT_WIDTH-1:0] previousstate = 0;
reg [OUTPUT_WIDTH-1:0] presentstate = 1;
reg [6:0] fib_number_cnt = 1;
reg [OUTPUT_WIDTH-1:0] nextstate = 1;
Это эквивалентно написанию «начальное» заявление назначая эти значения, которое не является Синтезируемый - в аппаратных средствах нет такой ценности, как значение по умолчанию. Когда вы вставляете свой дизайн внутри FPGA, все эти регистры будут принимать случайные значения.
Вместо этого вам нужно инициализировать эти счетчики/состояния внутри вашего всегда блока, когда сброс высок.
always @(posedge clk or posedge reset)
if (reset) begin
previousstate <= 0;
presentstate <= 1;
... etc ...
end
Ответ на последующие вопросы:
При инициализации кода, как это, вообще ничего не происходит на аппаратном уровне - он получает полностью игнорируется, так же, как если бы вы положили в $ дисплей заявление. Инструмент синтеза пропускает все симуляционные конструкции, но обычно дает вам какое-то предупреждение об этом (это действительно зависит от инструмента).
Теперь блокирующий и неблокирующий вопрос требует очень длинного ответа :). Я приведу вас к этой статье из SNUG-2000, которая, вероятно, является лучшей бумагой, когда-либо написанной по этому вопросу. Он отвечает на ваш вопрос, как и многие другие по этой теме. Позже вы поймете, почему использование блокирующих операторов в последовательной логике считается плохой практикой, и почему ваш код отлично работает с операторами блокировки.
http://cs.haifa.ac.il/courses/verilog/cummings-nonblocking-snug99.pdf
Больше ответов:
Обычный «шаблон» для создания логики, как ваша, чтобы иметь два всегда блоков, один определяющий логику, и один определения триггеров. В первом случае вы используете блокирующие операторы для реализации логики, а в последнем вы защелкиваете (или перезапускаете) генерируемое значение. Итак, что-то вроде этого:
wire some_input;
// Main logic (use blocking statements)
reg state, next_state;
always @*
if (reset) next_state = 1'b0;
else begin
// your state logic
if (state) next_state = some_input;
else next_state = 1'b0;
end
// Flops (use non-blocking)
always @(posedge clock)
if (reset) state <= 1'b0;
else state <= next_state;
Обратите внимание, что я использую синхронный сброс, но при необходимости вы можете использовать async.
Интересный момент! Когда я инициализировал свои регистры, как показано в коде, синтезатор не жаловался. Что именно происходит в оборудовании, когда что-то подобное делается? –
Кроме того, когда я выполняю симуляцию с неблокирующими операторами в всегда блоке, числа, которые я получаю, не совпадают с операторами блокировки. Зачем? (Операторы блокировки дают правильные результаты) –
Привет, спасибо за дополнительный ввод. Чтение раздела 11, я вижу, что я должен добавить дополнительные элементы в список чувствительности для неблокирующих назначений для правильной работы. Но в списке чувствительности я не могу смешивать элементы с инициированным эффектом и уровнем срабатывания. Я также не могу сделать еще один блок с элементами, инициирующими уровень, потому что это будет делать несколько назначений для одних и тех же элементов в более чем одном блоке всегда (помните, согласно вашему предложению, я использую блок, инициированный фронтом, для инициализации элементов в состоянии сброса). Что бы вы посоветовали? Придерживайтесь блокировкой? –
Строки 13-16 являются правильными. "reg [6: 0] fib_number_cnt = 1;" это не то же самое, что использовать «начальную» инструкцию. Прочтите руководство по синтезу Xilinx для более подробного описания того, как инициализировать регистры.
Когда вы говорите «поведенческие», я предполагаю, что вы имеете в виду RTL. Создает ли ваш инструмент синтеза файл списка соединений Verilog и файл SDF? Если это так, вы запустили имитацию ворот с задержками SDF с аннотированным аннотацией? Это тоже прошло? Использует ли ваша цепочка инструментов средство проверки эквивалентности или средство анализа статического времени? Это поможет вам определить, есть ли у вас функциональная ошибка или проблема с синхронизацией. – toolic
Я не делал никаких STA. Я использую Xilinx ISE без доступа Primetime или другого инструмента анализа STA. Я попытаюсь использовать Xilinx Timing Analyzer и посмотреть, какую информацию я могу извлечь. –