我无法理解以下Verilog代码

我无法理解此代码结尾的两行
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与
pcinc
的所有位连接在一起,以组合
pc_plus_4
信号。但是,在这种情况下,由于
pcinc
pc_plus_4
都是32位宽,因此
pc[31]
被忽略。一个好的整理工具会通知您RHS为33位,LHS为32位,并且最高有效位将丢失。该行可以更简单地编码为:
assign pc_plus_4 = pcinc;
最后一行是我正在使用的一个模拟器的编译错误。您没有明确声明
branch_aadr
信号的宽度,并且and11ѭ常数的宽度未指定。     
        最后一行还包含一个复制运算符,该运算符使用两组花括号。
{13{offset[15]}}
这将位ѭ13replicate复制了13次。看来作者正在对ѭ14进行符号扩展,然后将其添加到
pcinc
。更好的方法可能是声明“ 14”为已签名。
//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;
    

要回复问题请先登录注册