-->

i can't understand the following verilog code

2019-09-17 02:11发布

问题:

i can't understand the two lines at the end of this code

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

回答1:

If you are unfamiliar with curly braces {}, they are concatenation operators. You can read about them in the IEEE Std for Verilog (for example, 1800-2009, Section 11.4.12).

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

This concatenates the MSB of pc with all bits of pcinc to assemble the pc_plus_4 signal. However, in this case, since pcinc and pc_plus_4 are both 32 bits wide, pc[31] is ignored. A good linting tool will notify you that the RHS is 33 bits and the LHS is 32 bits, and that the most significant bit will be lost. The line can be more simply coded as:

assign pc_plus_4 = pcinc;

The last line is a compile error for one simulator I'm using. You did not explicitly declare the width of the branch_aadr signal, and the width of the 0 constant is unspecified.



回答2:

The last line also contains a replication operator, which uses two sets of curly braces.

{13{offset[15]}}

This replicates the bit offset[15] thirteen times. It looks like the author is doing a sign extension on offset before adding it to pcinc. A better way might be to declare offset as signed.

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