2016-04-17 16 views
0

Mein Verilog-Code sieht so aus. Das Modul implementiert ein Nachschlagetabellen-ROM mit einem Adreßregister, das an einem Taktimpuls inkrementiert. Die Ausgabe davon wird dekodiert, um eine 32-Bit-Zahl zu ergeben. Ich verstehe nicht, warum k ein Register sein muss. Tatsächlich möchte ich nicht, dass k eine getaktete Verzögerung hat, nachdem sich das Adressregister geändert hat. Wie soll die Dekodierung addr spezifiziert werden?Debugging-Fehler "prozedurale Zuweisung zu einem Nicht-Register k ist nicht zulässig"

(Beachten Sie, dass scheint nicht verwandt mit der ähnlich genannten anderen Frage auf SO, da ich schon überprüft, dass ich - ich will kein Register auf der Ausgabe. Ich möchte nur asynchrone Decodierung der Ausgabe eines Zählregisters. Vielleicht ich bin verwirrt über die < = Operator, nehme ich an immer ein getaktetes Register erzeugen, aber vielleicht sollte ich < = verwenden immer.)

module k_rom (input clk, input reset, output [31:0] k); 
// Constants defined by the SHA-2 standard. 
reg [5:0] addr; 

always @ (addr) 
    begin 
     case(addr) 
      6'h00: k = 32'h428a2f98; 
      6'h01: k = 32'h71374491; 
      6'h02: k = 32'hb5c0fbcf; 
      6'h03: k = 32'he9b5dba5; 
      6'h04: k = 32'h3956c25b; 
      6'h05: k = 32'h59f111f1; 
      6'h06: k = 32'h923f82a4; 
      6'h07: k = 32'hab1c5ed5; 
      6'h08: k = 32'hd807aa98; 
      6'h09: k = 32'h12835b01; 
      6'h0a: k = 32'h243185be;           
// other constants not shown for brevity 
      6'h3c: k = 32'h90befffa; 
      6'h3d: k = 32'ha4506ceb; 
      6'h3e: k = 32'hbef9a3f7; 
      6'h3f: k = 32'hc67178f2; 
     endcase 
    end 

always @ (posedge clk) 
    begin 
     if(reset) 
      addr <= 6'b0; 
     else 
      addr <= addr + 6'b1; 
    end 

endmodule 

Antwort

6

die LHS einer Zuweisung in einem Verfahrensblock muss vom Typ reg sein. Prozedurale Zuweisungsanweisungen weisen reg, integer, real oder time Variablen zu und kann nicht Werte zu wire zuweisen. Beachten Sie, dass reg abhängig von einem auslösenden Ereignis einen Wert speichern oder speichern kann, während wire keinen Wert speichern kann.

Hier k ist einen gewissen Wert, bis die addr Signaländerungen zu halten. Von nun an muss es reg Typ sein.

Standardmäßig ist das Signal output vom Typ wire. Deklariere k als output reg [31:0] k.

module k_rom (input clk, input reset, output reg [31:0] k); 

Die Verwendung von blockierenden Zuweisungen (=) und nicht-blockierenden Zuweisungen (<=) scheint in dem obigen Code korrekt zu sein.

Verwenden Blockierung Zuordnungen (=) für kombinatorische Logik (der always @(addr) Block). Verwenden Sie nicht blockierende Zuweisungen (<=) für sequentielle Logik (always @(posedge clk) Block).

Sie können jedoch lieber always @(*) (oder always_comb für SystemVerilog) anstelle von always @(addr) als automatische Empfindlichkeitsliste verwenden.

Siehe this PDF für den Unterschied zwischen reg und wire.

+0

Ich denke, dass ein Großteil meiner Verwirrung darauf zurückzuführen ist, wann es eine Verriegelung gegen kombinatorische Logik erzeugen wird: die Hardware-Instanziierung mit den Sprachkonstrukten in Bezug setzen. Reg klingt wie ein Register, aber ich glaube nicht. Also, wenn ich das verstehe, ist es eigentlich nur die Tatsache, dass die Empfindlichkeit, die erzeugt wird, eine tatsächliche getaktete Verriegelung erzeugt? Ich habe Verilog an anderer Stelle gefunden, die <= auch für kombinatorische Logik verwendet. – Robotbugs

+0

Dies ist ein sehr weites Diskussionsthema. Verweisen Sie auf diese Frage (http://electronics.stackexchange.com/questions/91688/difference-between-blocking-and-nonblocking-assignment-verilog) für "=" und "<=" Unterschied. – sharvil111

+0

Verriegelungen sorgen für viel Zeit und Probleme beim Entwurf. Latches werden nicht nur durch fehlende "posedge" -Stücke, sondern auch durch das Fehlen von "else" in 'if ..else'-Anweisung, fehlende 'default'-Anweisung usw. Siehe [this link] (http://stackoverflow.com/questions/22459413/what-is-inferred-latch-and-how-it-is-created-when-it -is-missing-else-statement-i) und [this link] (http://electronics.stackexchange.com/questions/38645/why-are-inferred-latches-bad) für grundlegende Idee über Latches. – sharvil111