0

我无法理解这段代码末尾的两行

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 连接起来。但是,在这种情况下,因为和都是 32 位宽,所以会被忽略。一个好的 linting 工具会通知您 RHS 是 33 位,LHS 是 32 位,并且最高有效位将丢失。该行可以更简单地编码为:pcincpc_plus_4pcincpc_plus_4pc[31]

assign pc_plus_4 = pcinc;

最后一行是我正在使用的一个模拟器的编译错误。您没有明确声明branch_aadr信号的宽度,并且0未指定常量的宽度。

于 2011-06-01T13:41:35.707 回答
5

最后一行还包含一个复制运算符,它使用两组花括号。

{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 回答