a[j+:k]; 或 a[j-:k];
其中,k必须是常数,代表位宽;j则是可变的,当用+:时,j作为变量的最低有效位,j+k-1作为变量的最高有效位,当用-:时,j作为变量的最高有效位,j-k+1作为变量的最低有效位。接下来,举个简单的例程来证明这个规则的正确性。假设有一个位宽为6的输入信号din,将它的每两位赋给位宽为2的输出变量即dout1=din[5:4]、dout2=din[3:2]、dout3=din[1:0]。
(1)对于[j+:k]这种情况的相应代码描述如下:
/*********************版权申明***********************
** 电子技术应用网站, CrazyBird
**----------------------------文件信息-----------------------------------
** 文件名: signal_test.v
** 创建者: CrazyBird
** 创建日期: 2015-7-18
** 版本号: v1.0
** 功能描述: 变量位宽表示中符号+:功能的验证
**
****************************************************/
// synopsys translate_off
`timescale 1 ns / 1 ps
// synopsys translate_on
module signal_test(
rst_n,
clk,
din,
dout1,
dout2,
dout3
);
//*************************************************
// 参数定义
//*************************************************
parameter DIN_WIDTH = 6; // 输入数据位宽
parameter DOUT_WIDTH = 2; // 输出数据位宽
parameter PAYLOAD_WIDTH = 2; // 加载数据位宽
//*************************************************
// 输入/输出端口声明
//*************************************************
input rst_n;
input clk;
input [DIN_WIDTH-1 :0] din;
output reg [DOUT_WIDTH-1:0] dout1;
output reg [DOUT_WIDTH-1:0] dout2;
output reg [DOUT_WIDTH-1:0] dout3;
//*************************************************
// 变量位宽表示中符号+:功能的验证
//*************************************************
always @(posedge clk or negedge rst_n)
begin
if(rst_n==1'b0)
begin
dout1 <= (0);
dout2 <= (0);
dout3 <= (0);
end
else
begin
dout1 <= din[0*PAYLOAD_WIDTH+:PAYLOAD_WIDTH];
dout2 <= din[1*PAYLOAD_WIDTH+:PAYLOAD_WIDTH];
dout3 <= din[2*PAYLOAD_WIDTH+:PAYLOAD_WIDTH];
end
end
//*************************************************
endmodule
//*******************文件结束*************************
其modelsim仿真结果如下:
(2)对于[j-:k]这种情况的相应代码描述如下:
/********************版权申明*********************
** 电子技术应用网站, CrazyBird
**--------------------------文件信息--------------------------------
** 文件名: signal_test1.v
** 创建者: CrazyBird
** 创建日期: 2015-7-18
** 版本号: v1.0
** 功能描述: 变量位宽表示中符号-:功能的验证
**
***************************************************/
// synopsys translate_off
`timescale 1 ns / 1 ps
// synopsys translate_on
module signal_test1(
rst_n,
clk,
din,
dout1,
dout2,
dout3
);
//*************************************************
// 参数定义
//*************************************************
parameter DIN_WIDTH = 6; // 输入数据位宽
parameter DOUT_WIDTH = 2; // 输出数据位宽
parameter PAYLOAD_WIDTH = 2; // 加载数据位宽
//*************************************************
// 输入/输出端口声明
//*************************************************
input rst_n;
input clk;
input [DIN_WIDTH-1 :0] din;
output reg [DOUT_WIDTH-1:0] dout1;
output reg [DOUT_WIDTH-1:0] dout2;
output reg [DOUT_WIDTH-1:0] dout3;
//*************************************************
// 变量位宽表示中符号-:功能的验证
//*************************************************
always @(posedge clk or negedge rst_n)
begin
if(rst_n==1'b0)
begin
dout1 <= (0);
dout2 <= (0);
dout3 <= (0);
end
else
begin
dout1 <= din[1*PAYLOAD_WIDTH-1-:PAYLOAD_WIDTH];
dout2 <= din[2*PAYLOAD_WIDTH-1-:PAYLOAD_WIDTH];
dout3 <= din[3*PAYLOAD_WIDTH-1-:PAYLOAD_WIDTH];
end
end
//*************************************************
endmodule
//******************文件结束**************************
其modelsim仿真结果如下:
通过观察仿真结果发现,已验证了+:和-:的上述规则。