confundido com "tarefa" palavra-chave, o que aconteceu aqui?

F

FrankCh

Guest
Eu escrevi uma tarefa de alimentar vetores de teste para o meu projeto, porém, percebi que alguns
diferenças entre
"tarefa" e as máquinas de estado normal, eu costumava fazer.Um código de exemplo abaixo, eu
estou esperando o
o sinal "trd_sample" de ser adiada por um ciclo de "trc", ou seja, 2
posedge do TRC.Contudo,
Porque é que a simulação mostra no primeiro posedge de TRC?

Eu coloquei a onda ModelSim aqui.<img src="http://img234.imageshack.us/img234/5034/confusedtask7bg.jpg" border="0" alt="Confused with "task" keyword, what happened here?" title="Confundida com a "tarefa" palavra-chave, o que aconteceu aqui?"/>Thank you in advance.

sim módulo;
reg clk;
rst_n reg;

TRW reg;
reg [3:0] trd;
reg trc;

reg [3:0] trd_sample;

sempre # 5 clk <= clk ~;

initial begin
clk <= 1'b0;
rst_n <= 1'b1;
# 1 rst_n <= 1'b0;
# 2 rst_n <= 1'b1;
tx_in;
$ stop ();
fimtx_in tarefa;
inteiro i, j;
começo
@ (Posedge clk);
@ (Posedge clk);
trc <= 1'b0;
TRW <= 1'b0;
trd <= 4'h0;
@ (Posedge clk);
trc <= 1'b1;
TRW <= 1'b1;
trd <= 4'hA;
@ (Posedge clk);
trc <= 1'b0;
@ (Posedge clk);
trc <= 1'b1;
trd <= 4'h9;
@ (Posedge clk);
trc <= 1'b0;
@ (Posedge clk);
trc <= 1'b1;
trd <= 4'h8;
@ (Posedge clk);
trc <= 1'b0;
@ (Posedge clk);
trc <= 1'b1;
trd <= 4'h7;
@ (Posedge clk);
@ (Posedge clk);
@ (Posedge clk);
@ (Posedge clk);
fim
EndTask

always @ (posedge trc ou negedge rst_n) começam
if (~ rst_n)
trd_sample <= 4'h0;
else begin
if (TRW)
trd_sample <= TRD;
fim
fim

endmodule

 
Bem, efetivamente você está definindo os dados a alterar ao mesmo tempo, como o relógio, então tente changign os dados de um ciclo de clk cada vez mais cedo, e você deve ver o comportamento que você deseja.

 
Seu código parece OK!Pode haver algum problema com o
ModelSim versão você está usando.Tente usar o simulador de viz.
ncsim ou vcs.

 
Oi,
Não tem nada a ver com a sua tarefa, e você eventos programados no TRC e trd de tal forma que ambos são atualizados para o delta do mesmo ciclo.Como resposta também apontou outros, você está alterando dados e clk, ao mesmo tempo e, portanto, é o resultado que você está vendo.Lembre-se, NBA (Non-Blocking Atribuir) em Verilog é "regular" e no seu caso, você tem:

trc <= 1'b1;
trd <= 8'haa; / ou coisa alguma
@ (posedge clk)

Isto significa que você agendar 2 eventos no TRC & trd e ambos são atualizados no final de uma etapa de tempo antes de passar à próxima @ (clk posedge) (como não há um atraso evento lá).

Agora você tem sempre uma outra amostragem blk em trc posedge - TRC posedge acontece quando o agendamento prévio é completa, então trd tem o seu novo valor também.

Na verdade, se você usar VCS DVE (sua ferramenta de depuração novo), você pode gravar "atrasos" delta e depurar isso muito claramente (Você pode expandir uma borda clk e ele mostra claramente como o agendamento de eventos acontece), não tenho certeza se tem Modelsim esse recurso.

HTH
Aji
http://www.noveldv.com

 
Isto não é algum erro no seu código, tente usar outros simuladores como vcs.Eu acho que sua ModelSim deve ter algum problema.

 
Olá, você deve consultar o agendamento Verilog mechansim que pode lhe diz o porquê!

Aqui, acabei de mencionar que você tem codificados e por isso o resultado é este:
(1) @ (posedge) trc <= 1; TRW <= 1; atribuição destas duas afirmações 'acontecerá no mesmo ciclo de simulação e neste momento o tempo vai simuator incremento não.Isso significa que: a de que esses dois valores é que aconteceu ao mesmo tempo.
(2) @ (posedge trc ou negedge rst_n)
...
(TRW se)
trd_sample <= TRD;

desde trc e TRW happeded ao mesmo tempo, o que significa uma vez que o mesmo @ (posedge TRC) é verdadeira, então o valor da TRW é verdade também, então o trd_sample será executado.
(3) a modificação de sua tarefa é necessário de acordo com suas necessidades:
@ (posedge clk)
trc <= 1;
@ (negedge clk) / / outros atrasos são bem assim
TRW <= 1;

Talvez ajude você!

 

Welcome to EDABoard.com

Sponsor

Back
Top