2011-06-01 4 views
0

je ne peux pas comprendre les deux lignes à la fin de ce codeje ne peux pas comprendre le code Verilog suivant

input [15:0] offset ; 
output [31:0] pc; 
output [31:0] pc_plus_4; 
reg [31:0] pc; 
wire [31:0] pcinc ; 

assign pcinc = pc +4 ; 
assign pc_plus_4 = {pc[31],pcinc}; 

assign branch_aadr = {0,pcinc + {{13{offset[15]}},offset[15:0],2'b00}}; 
+2

Où exactement vous coincez-vous? – Marty

Répondre

7

Si vous n'êtes pas familier avec accolades {}, ils sont des opérateurs de concaténation. Vous pouvez lire à leur sujet dans le document IEEE Std for Verilog (par exemple, 1800-2009, Section 11.4.12).

assign pc_plus_4 = {pc[31],pcinc}; 

Cette concatène le MSB de pc avec tous les bits de pcinc pour assembler le signal pc_plus_4. Cependant, dans ce cas, étant donné que pcinc et pc_plus_4 sont tous les deux 32 bits de large, pc[31] est ignoré. Un bon outil de pelage vous informera que le RHS est de 33 bits et que le LHS est de 32 bits, et que le bit le plus significatif sera perdu. La ligne peut être plus simplement codé comme:

assign pc_plus_4 = pcinc; 

La dernière ligne est une erreur de compilation pour un simulateur j'utilise. Vous n'avez pas explicitement déclaré la largeur du signal branch_aadr et la largeur de la constante 0 n'est pas spécifiée.

5

La dernière ligne contient également un opérateur de réplication, qui utilise deux ensembles d'accolades.

{13{offset[15]}} 

Cela reproduit le bit offset[15] treize fois. Il semble que l'auteur fasse une extension de signe sur offset avant de l'ajouter à pcinc. Une meilleure façon pourrait être de déclarer offset comme étant signé.

//Three ways to replicate bits 
wire [3:0] repeated; 
wire  value; 

//These two assignments have the same effect 
assign repeated = {4{value}};     //Replication operator 
assign repeated = {value,value,value,value}; //Concatenation operator 

//These four taken together have the same effect as the above two 
assign repeated[3] = value; //Bit selects 
assign repeated[2] = value; 
assign repeated[1] = value; 
assign repeated[0] = value; 
+0

merci pour votre réponse! c'est très utile – Rojin

Questions connexes