hls for 写法1:
void for_v1_0(uint32 packet[OUT_WIDTH])
{
//#pragma HLS INTERFACE bram port=packet
uint32 j = 0;
loop_packet:
for(int i = 0; i < OUT_WIDTH;i++)
{
//#pragma HLS UNROLL
//#pragma HLS PIPELINE
packet[i] = j;
j++;
}
}
general verilog code FSM:
hls for 写法2(对for 循环进行 pipline 约束):
void for_v1_0(uint32 packet[OUT_WIDTH])
{
//#pragma HLS INTERFACE bram port=packet
uint32 j = 0;
loop_packet:
for(int i = 0; i < OUT_WIDTH;i++)
{
//#pragma HLS UNROLL
#pragma HLS PIPELINE
packet[i] = j;
j++;
}
}
verilog code FSM:增加 pipline之后,状态机增加一个end状态,end状态无条件切换到IDLE,在end状态 ip产生ap_done、ap_ready 为high,同时在loop之外,增加一个 initiation interval。
hls for 写法3(约束loop 为unroll,约束端口为bram,但不约束资源):
void for_v1_0(uint32 packet[OUT_WIDTH])
{
#pragma HLS INTERFACE bram port=packet
uint32 j = 0;
loop_packet:
for(int i = 0; i < OUT_WIDTH;i++)
{
#pragma HLS UNROLL
//#pragma HLS PIPELINE
packet[i] = j;
j++;
}
}
general verilog code FSM:
demo发送一百个数,状态有50个状态,bram变成一个双口bram(A port B port),每个port输出50个数
若不约束端口为BRAM,端口变为memory,但仍然是两个port。
若约束资源为simple bram,约束loop为unroll,状态增加为100个状态,每个状态写入一个数。hls 报告页面 interval 为99,比发送数量少1,不符合bram逻辑。
若约束资源为 simple bram,约束loop 为pipline,interval 为102,发送数量为100,符合bram逻辑, 状态机状态图如下: