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