2015-04-12 2 views
0

У меня этот код ниже:асинхронный сброс загадочно настройки выходной рег

module timer(
    input clk, 
    input reset, 
    output reg signal // <--- PROBLEMATIC SIGNAL 
); 

    [email protected](posedge clk or posedge reset) 
    begin 
    if(reset) 
     signal <= 1; 
    else 
     signal <= 0; 
    end 
endmodule 

и этот испытательный стенд, который был выполнен на ModelSim:

`timescale 1ns/1ps 
`define PERIOD 20 

module timer_tb; 
    logic clk; 
    logic reset; 
    logic signal; 

    timer inst(
     .clk(clk), 
     .reset(reset), 
     .signal(signal) 
    ); 

    initial 
    begin 
     clk = 0; 
     forever clk = #(`PERIOD/2) ~clk; 
    end 

    initial 
    begin 
     reset = 0; //<--- RESET STARTS CLEANED. 
     #(`PERIOD) 
     reset = 1; 
     #(`PERIOD) 
     reset = 0; 
     #(`PERIOD*3) 
     reset = 1; 
     #(`PERIOD) 
     reset = 0; 

     #(`PERIOD*3) 
     $display("End of the simulation"); 
     $stop; 
    end 
endmodule 

Выходной рег signal начинает ВЫСОКИЙ, но в коде, этот рег зависит от reset, а reset начинает DOWN. Я не понимаю, почему signal регистр HIGH в начале моделирования, так как reset начинается с уверенности. ВНИЗ.

Мне нужен signal начиная с DOWN и устанавливаться только IF reset перейти к 1 (состояние posedge reset точно так же, как мой код).

Пожалуйста, взгляните на this print of the waveform для ясного понимания моей проблемы.

ответ

0

Ваш сигнал имеет часы-к-д задержки, но у вашей модели RTL нет никакой задержки. Это означает, что вы не используете RTL-симуляцию. Скорее, вы запускаете синтезированное моделирование уровня ворот или получаете выход из ПЛИС.

Что-то нужно учесть, что в испытательном стенде clk и reset начинаются с X не 0. Становится 0 в момент времени 0. Verilog допускает неопределенный порядок параллельного процесса, необязательно выполнять всегда блок в нулевое время независимо от его списка чувствительности, а X in для сравнения оценивается как истинный. В зависимости от того, как поставщик реализовал симулятор, возможно, что сначала выполняется первый блок. reset является X истинным и присваивает signal 1. Затем clk и reset присвоены 0. Все это происходит во время 0 и не может быть замечено в форме волны.

Это позволило непредсказуемость - непреднамеренный кусок реальности. Когда вы сначала включаете схему, из которой вы вначале получаете, это может быть непредсказуемо (это зависит от изменения процесса, физической маршрутизации, сбоев при отключении питания и т. Д.). Вы используете сброс, чтобы получить дизайн в известное состояние.

Если вы хотите, чтобы предотвратить clk и reset из когда-либо начать X, а затем изменить тип данных в тестовом стенде с logic до bit (примечание: bit и logic являются SystemVerilog).Другим вариантом, который должен работать (не гарантируется на 100%), является инициализация clk и reset в той же строке, что и декларация.

logic clk = 1'b0; 
logic reset = 1'b0; 

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

Чистое решение должно начинаться с reset. Вам не важно, какие значения перед сбросом в нулевое время.

+0

Спасибо вам за ваше объяснение , Вы правы, я запускаю имитацию уровня ворот в программном обеспечении modelsim-altera. Я попытался применить ваши предложения (изменения от логики до бит в testbench и инициализировать clk и сбросить как 0 в той же строке, что и декларация.), Но я все равно получаю тот же результат. Это невероятно. [Сигнал] (http://postimg.org/image/i2rg1rkhn/) по-прежнему переключается на 1 и возвращается, когда clk встает, даже все, начиная с 0 (не X). Это очень любопытно. –

0

signal не имеет начального значения, поэтому его значение в момент времени 0 не определено. Некоторые имитаторы инициализировать его в 0, другие 1, другие в X.

Используйте начальный блок, что signal инициализируется 0.

module timer(
    input clk, 
    input reset, 
    output wire signal 
); 

    reg rsignal; 
    assign signal = rsignal; 

    initial begin 
     rsignal = 1'b0; 
    end 

    [email protected](posedge clk or posedge reset) 
    begin 
    if(reset) 
     rsignal <= 1; 
    else 
     rsignal <= 0; 
    end 
endmodule 
+0

Благодарим вас за ответ. Но я не могу использовать начальные утверждения, потому что мне нужно построить синтезируемый дизайн. Еще один момент в том, что я протестировал дизайн без чувствительности «или posedge reset», и я правильно понял «сигнал» с 0. Я не знаю, почему это происходит как следствие вставки асинхронного сброса ... –

+0

«initial» синтезируется, по крайней мере, для FPGA и CPLD. Вероятно, не для ASIC. –

+0

Я использовал начальную инструкцию и ваш код. Но сигнал продолжает запускать HIGH. Посмотрите на эти отпечатки: [waveform] (http://postimg.org/image/m1ig5ii0n/) || [ваш дизайн в quartus] (http://postimg.org/image/3ry7w65b1/) –

0

Значение по умолчанию рег является «х» или не определено и по умолчанию значение провода - это «Hi-Z», поэтому в этом случае ваш выход (сигнал) является рег-типом, поэтому симулятор получил значение по умолчанию соответственно, для получения значения по умолчанию «0» SystemVerilog (IEEE1800-2012) поставляется с типом данных бит, вы можете попробовать использовать бит на выходе, как показано ниже:

module timer(
    input clk, 
    input reset, 
    output bit signal 
); 

    [email protected](posedge clk or posedge reset) 
    begin 
    if(reset) 
     signal <= 1; 
    else 
     signal <= 0; 
    end 
endmodule 

EDIT: Я не уверен в Quartus, но, наоборот, вы можете попробовать инициализировать значение 0 или 1 на выходе с помощью этого метода, он должен работать в Verilog

module timer(
    input clk, 
    input reset, 
    output reg signal=0 
); 

    [email protected](posedge clk or posedge reset) 
    begin 
    if(reset) 
     signal <= 1; 
    else 
     signal <= 0; 
    end 
endmodule 
+0

Спасибо! Я попробую это прямо сейчас –

+0

К сожалению, я ограничен разработкой конструкции verilog. Я не могу использовать системные верительные задания или конструкции. Таким образом, в программном обеспечении quartus я получаю эту ошибку после попытки использовать конструкцию «бит»: «Ошибка (10161): ошибка Verilog HDL на timer.v (5): объект« бит »не объявлен« –

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