关于FPGA时序约束设计请教!
always@(posedge clk)
begin
if(rst)
begin
rx_bram_din_reg <= 64'b0;
end
else
begin
rx_bram_din_reg <= rx_bram_din;
end
end
always@(posedge clk)
begin
if(rst)
begin
rx_bram_wr_en0 <= 1'b0;
rx_bram_wr_en1 <= 1'b0;
rx_bram_wr_en2 <= 1'b0;
rx_bram_wr_en3 <= 1'b0;
end
else begin
case(rx_bram_addr[5:4])
2'b00:begin
rx_bram_wr_en0 <= rx_bram_wr_en;
rx_bram_wr_en1 <= 1'b0;
rx_bram_wr_en2 <= 1'b0;
rx_bram_wr_en3 <= 1'b0;
end
2'b01:begin
rx_bram_wr_en0 <= 1'b0;
rx_bram_wr_en1 <= rx_bram_wr_en;
rx_bram_wr_en2 <= 1'b0;
rx_bram_wr_en3 <= 1'b0;
end
2'b10:begin
rx_bram_wr_en0 <= 1'b0;
rx_bram_wr_en1 <= 1'b0;
rx_bram_wr_en2 <= rx_bram_wr_en;
rx_bram_wr_en3 <= 1'b0;
end
2'b11:begin
rx_bram_wr_en0 <= 1'b0;
rx_bram_wr_en1 <= 1'b0;
rx_bram_wr_en2 <= 1'b0;
rx_bram_wr_en3 <= rx_bram_wr_en;
end
default: begin
rx_bram_wr_en0 <= 1'b0;
rx_bram_wr_en1 <= 1'b0;
rx_bram_wr_en2 <= 1'b0;
rx_bram_wr_en3 <= 1'b0;
end
endcase
end
end
assign rx_doutb = {rx_doutb3[1023:0],rx_doutb2[1023:0],rx_doutb1[1023:0],rx_doutb0[1023:0]};
DMA_BRAM rx_bram_inst0 (
.clka(clk), // input clka
.wea(rx_bram_wr_en0), // input [0 : 0] wea
.addra({1'b0,rx_bram_addr_reg}), // input [4 : 0] addra
.dina(rx_bram_din_reg ), // input [63 : 0] dina
.douta(), // output [63 : 0] douta
.clkb(clk), // input clkb
.web(1'b0), // input [0 : 0] web
.addrb(1'b0), // input [0 : 0] addrb
.dinb(), // input [63 : 0] dinb
.doutb(rx_doutb0) // output [1023 : 0] doutb
);
DMA_BRAM rx_bram_inst1 (
.clka(clk), // input clka
.wea(rx_bram_wr_en1), // input [0 : 0] wea
.addra({1'b0,rx_bram_addr_reg}), // input [4 : 0] addra
.dina(rx_bram_din_reg ), // input [63 : 0] dina
.douta(), // output [63 : 0] douta
.clkb(clk), // input clkb
.web(1'b0), // input [0 : 0] web
.addrb(1'b0), // input [0 : 0] addrb
.dinb(), // input [63 : 0] dinb
.doutb(rx_doutb1) // output [1023 : 0] doutb
);
DMA_BRAM rx_bram_inst2 (
.clka(clk), // input clka
.wea(rx_bram_wr_en2), // input [0 : 0] wea
.addra({1'b0,rx_bram_addr_reg}), // input [4 : 0] addra
.dina(rx_bram_din_reg ), // input [63 : 0] dina
.douta(), // output [63 : 0] douta
.clkb(clk), // input clkb
.web(1'b0), // input [0 : 0] web
.addrb(1'b0), // input [0 : 0] addrb
.dinb(), // input [63 : 0] dinb
.doutb(rx_doutb2) // output [1023 : 0] doutb
);
DMA_BRAM rx_bram_inst3 (
.clka(clk), // input clka
.wea(rx_bram_wr_en3), // input [0 : 0] wea
.addra({1'b0,rx_bram_addr_reg}), // input [4 : 0] addra
.dina(rx_bram_din_reg ), // input [63 : 0] dina
.douta(), // output [63 : 0] douta
.clkb(clk), // input clkb
.web(1'b0), // input [0 : 0] web
.addrb(1'b0), // input [0 : 0] addrb
.dinb(), // input [63 : 0] dinb
.doutb(rx_doutb3) // output [1023 : 0] doutb
);
下面是时序报告:
SLICE_X69Y127.AQ Tcko 0.337 rx_dma_bram_wrapper_inst/rx_bram_din_reg<43>
rx_dma_bram_wrapper_inst/rx_bram_din_reg_40
RAMB36_X6Y40.DIADI0 net (fanout=4) 9.339 rx_dma_bram_wrapper_inst/rx_bram_din_reg<40>
RAMB36_X6Y40.CLKARDCLKL Trdck_DIA 0.707 rx_dma_bram_wrapper_inst/rx_bram_inst1/U0/xst_blk_mem_generator/gnativebmg.native_blk_mem_gen/valid.cstr/ramloop[20].ram.r/v6_init.ram/TRUE_DP.SIMPLE_PRIM36.ram
rx_dma_bram_wrapper_inst/rx_bram_inst1/U0/xst_blk_mem_generator/gnativebmg.native_blk_mem_gen/valid.cstr/ramloop[20].ram.r/v6_init.ram/TRUE_DP.SIMPLE_PRIM36.ram
---------------------------------------------------- ---------------------------
Total 10.383ns (1.044ns logic, 9.339ns route)
(10.1% logic, 89.9% route)
你可以手工在RTL里将rx_bram_din_reg寄存器组duplicate成四份,并用preserve注释防止综合器对其进行优化,那样一拖四就变成一拖一了
