2009-11-27 28 views
1

(insert disclaimer question vraiment fondamentale ici)Comment attribuer une valeur à une reg de sortie dans Verilog?

Plus précisément, j'ai la déclaration suivante:

output reg icache_ram_rw 

Et en un point du code que je dois mettre la valeur zéro dans ce reg. Voici ce que j'ai essayé et les résultats:

assign icache_ram_rw = 1'b0; 
(declarative lvalue or port sink reg icache_ram_rw must be a wire) 

icache_ram_rw <= 1'b0; 
(instance gate/name for type "icache_ram_rw" expected - <= read) 

Comment puis-je le faire après tout ?!

Répondre

13

La déclaration assign est utilisée pour la conduite wire s.

Si vous avez déclaré quelque chose comme reg, vous devez lui donner des valeurs dans une procédure (blocs always ou initial). Il est la meilleure pratique de valeurs unique ensemble de reg s dans le même bloc always. par exemple:

always @(*) begin // combo logic block 
    if(some_condition) begin 
     icache_ram_rw = 1'b0; 
    end else begin 
     icache_ram_rw = something_else; 
end 

Il existe des différences importantes entre reg s et wire s que vous devez lire sur.

J'ai un sentiment bien que vous aurez besoin d'une logique cadencée si vous êtes au volant des signaux de RAM. Dans ce cas, vous aurez besoin d'un code qui ressemble à ceci:

// some parameter definitions to make logic 'read' clearer. 
localparam READ = 1'b0; 
localparam WRITE = 1'b1; 

// standard clocked logic 'template' that synthesis tools recognise. 
always @(posedge clk or negedge resetb) 
    if(!resetb) begin // asynchronous active low reset 
    icache_ram_rw <= READ; 
    end else if(some_enable_condition) begin 
    icache_ram_rw <= WRITE; 
    end else begin 
    icache_ram_rw <= READ; 
    end 
+0

Merci pour la réponse complète! La logique cadencée est bien présente dans l'assignation, je l'ai simplement omise ici pour plus de simplicité (il s'avère qu'il aurait peut-être mieux valu l'ajouter) = D –

3

Notez que vous pouvez également attribuer une valeur initiale à un reg lorsque vous déclarez, comme ceci:

output reg icache_ram_rw = 1'b0;

Cela garantit qu'il commence avec la valeur zéro dans la simulation. Pour la synthèse, vos résultats dépendront de l'outil de synthèse et de la technologie cible (pour les FPGA, vous pouvez généralement attribuer une valeur initiale pour le matériel, pour l'ASIC, ce n'est pas le cas).

20

Supprimer « reg » de la déclaration de sortie et le code devrait fonctionner (par défaut le type de sortie de fil). Il y a deux choses que la plupart des ingénieurs autodidactes ou mal formés ont du mal à comprendre dans Verilog: (1) bloquer les devoirs non-bloquants (voir mon article sur ce sujet: http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf) et (2) vs- fil. Allons éclaircir ce dernier sujet en ce moment.

Tout sur la gauche à la main-Side (LHS) ou une affectation de procédure (toujours initiale, la tâche, la fonction) doit être déclarée comme un type variable (généralement un reg). Tout le reste dans la langue est un net (généralement un fil). Aucune exception. C'est vraiment simple. Je ne connais aucun livre Verilog qui le dit tout simplement.

Comment cela est-il arrivé? J'ai demandé à Phil Moorby, bon ami et inventeur du langage Verilog, "pourquoi reg?" Phil m'a dit que quand il a inventé Verilog, il n'y avait pas d'outils de synthèse et il pensait que tout ce qui sortait d'un bloc allait être un registre. Il avait tort, et maintenant nous sommes coincés avec ce mot-clé "reg".

J'ai essayé d'obtenir cela a changé les comités Veirlog et SystemVerilog depuis plus d'une décennie.Je voudrais déclarer tout comme le fil et la première utilisation déterminerait si le «fil» se comporte comme un reg (première attribution d'un bloc procédural et la dernière attribution gagne) ou se comporte comme un fil (première attribution provient d'une source motrice comme un sortie de module ou affectation continue et plusieurs pilotes sont résolus comme dans Verilog aujourd'hui) et il serait illégal de faire à la fois des assignations procédurales et des assignations de pilotes au même signal. Hélas, je n'ai pas eu assez de votes au comité pour réussir à faire adopter cette proposition.

C'est l'erreur que je fais le plus souvent dans mon propre code. Il suffit de s'habituer à des messages d'erreur comme, "affectation illégale LHS" ou "affectation illégale à fil". Ils signifient tous les deux la même chose, vous avez oublié de déclarer vos regs.

Cordialement - Cummings Cliff - Verilog & SystemVerilog Guru

0
  1. la question est que la déclaration assign quand sythesized va créer le port/thats broches pourquoi la nécessité d'un fil en sortie.
  2. vous avez créé le reg nommé icache_ram_rw maintenant un registre n'est pas identique à droite broche ....
  3. afin d'assigner un vous inscrire, vous devez utiliser un format approprié de verilog
  4. Verilog permet même en utilisant toujours déclaration, un DFF est créé et la broche d'entrée de ce DFF serait votre icache_ram_rw, le format est déjà fourni par d'autres.
Questions connexes