0

このコードの最後の 2 行が理解できません

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}};
4

2 に答える 2

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;

最後の行は、私が使用している1つのシミュレーターのコンパイルエラーです。branch_aadr信号の幅を明示的に宣言しておらず、0定数の幅は指定されていません。

于 2011-06-01T13:41:35.707 に答える
5

最後の行には、2セットの中括弧を使用するレプリケーション演算子も含まれています。

{13{offset[15]}}

offset[15]これはビットを13回複製します。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;
于 2011-06-01T17:33:54.523 に答える