2011-06-01 63 views
0

我不能在這個代碼我無法理解下面的Verilog代碼

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

你究竟在哪裏陷入困境? – Marty 2011-06-01 12:38:24

回答

7

年底瞭解兩行。如果你不熟悉的大括號{},它們是連接操作。您可以在IEEE Std for Verilog中閱讀它們(例如,1800-2009,第11.4.12節)。

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

該串接的pc的MSB與pcinc所有比特來組裝pc_plus_4信號。但是,在這種情況下,因爲pcincpc_plus_4都是32位寬,所以pc[31]被忽略。一個好的消息工具會告訴你RHS是33位,LHS是32位,最重要的位會丟失。該行可以更簡單地編碼爲:

assign pc_plus_4 = pcinc; 

最後一行是我正在使用的一個模擬器的編譯錯誤。您沒有明確聲明branch_aadr信號的寬度,並且0常量的寬度未指定。

5

最後一行還包含複製操作符,該操作符使用兩組花括號。

{13{offset[15]}} 

這複製了位offset[15]十三次。看起來作者在offset上做了一個符號擴展,然後將其添加到pcinc。更好的方法可能是將offset聲明爲已簽名。

//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

感謝您的回答!這是非常有幫助的 – Rojin 2011-06-03 06:32:12