d'abord tout ce que je ne vous encourage à utiliser l'instruction initial
sauf dans testbench. Ce n'est pas synthétisable, il ne devrait donc pas apparaître dans RTL. Ensuite, je pense que vous confondez Verilog avec un langage de programmation standard, ce qui n'est pas le cas.
En Verilog, il y a deux catégories de déclarations:
- processus, comme
always
ou initial
cession
- , avec
assign
qui vous permet d'attribuer directement une 'valeur' à un fil
Dans les processus, on peut distinguer deux classes:
processus synchrones, //do something
états begin end
seront évalués seulement lorsqu'un bord, spécifié dans le @
, se produit
always @ (posedge clock) begin
//do something
end
procédés combinatoires, les états //do something
seront évalués à chaque fois que la valeur d'un wire
ou reg
utilisé dans la //do something
bloc change
always @* begin
//do something
end
ici yo Vous avez instancié un processus à l'intérieur d'un processus qui n'a aucune réalité physique.
Un autre point, comme décrit, vous voulez activer le processus uniquement lorsque reset==0
de sorte que vous mettez une condition pour entrer dans le processus. Une fois de plus, cela n'a aucun sens en termes de synthèse. Le processus devrait être activé et c'est dans le processus que les conditions devraient être évaluées.
Une solution classique pour la mise en œuvre d'une bascule D avec remise à zéro asynchrone est la suivante:
module Dflipflop(
input D,
input reset,
input clk,
output reg Q
);
always @ (posedge clk or negedge reset) begin
if (!reset)
Q <= 1'b0; // Clear Q when reset negative edge occurs
else
Q <= D; // Capture D in Q when clk positive edge occurs and reset is high
end
endmodule