я не могу понять следующий код verilog - PullRequest
0 голосов
/ 01 июня 2011

я не могу понять две строки в конце этого кода

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 ]

7 голосов
/ 01 июня 2011

Если вы не знакомы с фигурными скобками {}, они являются операторами конкатенации.Вы можете прочитать о них в IEEE Std для Verilog (например, 1800-2009, раздел 11.4.12).

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

Это объединяет MSB pc со всеми битами pcinc всобрать сигнал pc_plus_4.Однако в этом случае, поскольку pcinc и pc_plus_4 имеют ширину 32 бита, pc[31] игнорируется.Хороший инструмент для распечатывания уведомит вас о том, что RHS составляет 33 бита, а LHS - 32 бита и что самый старший бит будет потерян.Строка может быть более просто закодирована как:

assign pc_plus_4 = pcinc;

Последняя строка - ошибка компиляции для одного симулятора, который я использую.Вы явно не объявляли ширину сигнала branch_aadr, а ширина константы 0 не указана.

5 голосов
/ 01 июня 2011

Последняя строка также содержит оператор репликации, который использует два набора фигурных скобок.

{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;
...