我无法理解这段代码末尾的两行
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}};
我无法理解这段代码末尾的两行
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}};
如果您不熟悉花括号{}
,它们是连接运算符。您可以在 IEEE Std for Verilog 中了解它们(例如,1800-2009,第 11.4.12 节)。
assign pc_plus_4 = {pc[31],pcinc};
这将组合信号pc
的所有位的 MSB 连接起来。但是,在这种情况下,因为和都是 32 位宽,所以会被忽略。一个好的 linting 工具会通知您 RHS 是 33 位,LHS 是 32 位,并且最高有效位将丢失。该行可以更简单地编码为:pcinc
pc_plus_4
pcinc
pc_plus_4
pc[31]
assign pc_plus_4 = pcinc;
最后一行是我正在使用的一个模拟器的编译错误。您没有明确声明branch_aadr
信号的宽度,并且0
未指定常量的宽度。
最后一行还包含一个复制运算符,它使用两组花括号。
{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;