| read_verilog <<EOT |
| // Citation https://github.com/ZipCPU/dspfilters/blob/master/rtl/fastfir.v |
| module fastfir_dynamictaps(i_clk, i_reset, i_tap_wr, i_tap, i_ce, i_sample, o_result); |
| wire [30:0] _00_; |
| wire [23:0] _01_; |
| wire [11:0] _02_; |
| wire [30:0] _03_; |
| wire [23:0] _04_; |
| wire [30:0] _05_; |
| wire [23:0] _06_; |
| wire [30:0] _07_; |
| wire [23:0] _08_; |
| wire [11:0] _09_; |
| wire [30:0] _10_; |
| wire [23:0] _11_; |
| wire [30:0] _12_; |
| wire [23:0] _13_; |
| wire [11:0] \fir.FILTER[0].tapk.delayed_sample ; |
| reg [30:0] \fir.FILTER[0].tapk.o_acc = 31'h00000000; |
| wire [11:0] \fir.FILTER[0].tapk.o_sample ; |
| reg [23:0] \fir.FILTER[0].tapk.product ; |
| reg [11:0] \fir.FILTER[0].tapk.tap = 12'h000; |
| wire [11:0] \fir.FILTER[1].tapk.delayed_sample ; |
| wire [30:0] \fir.FILTER[1].tapk.o_acc ; |
| wire [11:0] \fir.FILTER[1].tapk.o_sample ; |
| reg [23:0] \fir.FILTER[1].tapk.product ; |
| reg [11:0] \fir.FILTER[1].tapk.tap = 12'h000; |
| input i_ce; |
| input i_clk; |
| input i_reset; |
| input [11:0] i_sample; |
| input [11:0] i_tap; |
| input i_tap_wr; |
| output [30:0] o_result; |
| reg [30:0] o_result; |
| assign _03_ = 31'h00000000 + { \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product [23], \fir.FILTER[0].tapk.product }; |
| assign _04_ = $signed(\fir.FILTER[0].tapk.tap ) * $signed(i_sample); |
| always @(posedge i_clk) |
| \fir.FILTER[0].tapk.tap <= _02_; |
| always @(posedge i_clk) |
| \fir.FILTER[0].tapk.o_acc <= _00_; |
| always @(posedge i_clk) |
| \fir.FILTER[0].tapk.product <= _01_; |
| assign _02_ = i_tap_wr ? i_tap : \fir.FILTER[0].tapk.tap ; |
| assign _05_ = i_ce ? _03_ : \fir.FILTER[0].tapk.o_acc ; |
| assign _00_ = i_reset ? 31'h00000000 : _05_; |
| assign _06_ = i_ce ? _04_ : \fir.FILTER[0].tapk.product ; |
| assign _01_ = i_reset ? 24'h000000 : _06_; |
| assign _10_ = \fir.FILTER[0].tapk.o_acc + { \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product [23], \fir.FILTER[1].tapk.product }; |
| assign _11_ = $signed(\fir.FILTER[1].tapk.tap ) * $signed(i_sample); |
| always @(posedge i_clk) |
| \fir.FILTER[1].tapk.tap <= _09_; |
| always @(posedge i_clk) |
| o_result <= _07_; |
| always @(posedge i_clk) |
| \fir.FILTER[1].tapk.product <= _08_; |
| assign _09_ = i_tap_wr ? \fir.FILTER[0].tapk.tap : \fir.FILTER[1].tapk.tap ; |
| assign _12_ = i_ce ? _10_ : o_result; |
| assign _07_ = i_reset ? 31'h00000000 : _12_; |
| assign _13_ = i_ce ? _11_ : \fir.FILTER[1].tapk.product ; |
| assign _08_ = i_reset ? 24'h000000 : _13_; |
| assign \fir.FILTER[1].tapk.o_acc = o_result; |
| endmodule |
| EOT |
| |
| synth_xilinx |
| cd fastfir_dynamictaps |
| select -assert-count 2 t:DSP48E1 |
| select -assert-none t:* t:DSP48E1 %d t:BUFG %d |