2010-03-12 6 views
0

Я сделал поведенческое моделирование своего кода, и он отлично работает. Результаты прогнозируются. Когда я синтезирую свой код и загружаю его в spartan 3e FPGA и пытаюсь анализировать с помощью chipcope, результаты даже не приближаются к тому, что я ожидал. Что я сделал неправильно? http://pastebin.com/XWMekL7rКод Verilog имитирует, но не работает, как прогнозировалось на FPGA

+0

Когда вы говорите «поведенческие», я предполагаю, что вы имеете в виду RTL. Создает ли ваш инструмент синтеза файл списка соединений Verilog и файл SDF? Если это так, вы запустили имитацию ворот с задержками SDF с аннотированным аннотацией? Это тоже прошло? Использует ли ваша цепочка инструментов средство проверки эквивалентности или средство анализа статического времени? Это поможет вам определить, есть ли у вас функциональная ошибка или проблема с синхронизацией. – toolic

+0

Я не делал никаких STA. Я использую Xilinx ISE без доступа Primetime или другого инструмента анализа STA. Я попытаюсь использовать Xilinx Timing Analyzer и посмотреть, какую информацию я могу извлечь. –

ответ

5

Ваша проблема с линиями 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.

+0

Интересный момент! Когда я инициализировал свои регистры, как показано в коде, синтезатор не жаловался. Что именно происходит в оборудовании, когда что-то подобное делается? –

+0

Кроме того, когда я выполняю симуляцию с неблокирующими операторами в всегда блоке, числа, которые я получаю, не совпадают с операторами блокировки. Зачем? (Операторы блокировки дают правильные результаты) –

+0

Привет, спасибо за дополнительный ввод. Чтение раздела 11, я вижу, что я должен добавить дополнительные элементы в список чувствительности для неблокирующих назначений для правильной работы. Но в списке чувствительности я не могу смешивать элементы с инициированным эффектом и уровнем срабатывания. Я также не могу сделать еще один блок с элементами, инициирующими уровень, потому что это будет делать несколько назначений для одних и тех же элементов в более чем одном блоке всегда (помните, согласно вашему предложению, я использую блок, инициированный фронтом, для инициализации элементов в состоянии сброса). Что бы вы посоветовали? Придерживайтесь блокировкой? –

0

Строки 13-16 являются правильными. "reg [6: 0] fib_number_cnt = 1;" это не то же самое, что использовать «начальную» инструкцию. Прочтите руководство по синтезу Xilinx для более подробного описания того, как инициализировать регистры.

Смежные вопросы