Merge pull request #257 from antmicro/k6n10f_dsp_coeff_params
QuickLogic k6n10f DSP FIR coeffs as params
diff --git a/ql-qlf-plugin/ql-dsp-simd.cc b/ql-qlf-plugin/ql-dsp-simd.cc
index 1bd0850..f84c458 100644
--- a/ql-qlf-plugin/ql-dsp-simd.cc
+++ b/ql-qlf-plugin/ql-dsp-simd.cc
@@ -76,6 +76,9 @@
std::make_pair("z_o", "z"), std::make_pair("dly_b_o", "dly_b"),
};
+ // DSP parameters
+ const std::vector<std::string> m_DspParams = {"COEFF_0", "COEFF_1", "COEFF_2", "COEFF_3"};
+
// Source DSP cell type (SISD)
const RTLIL::IdString m_SisdDspType = RTLIL::escape_id("dsp_t1_10x9x32");
// Target DSP cell type for the SIMD mode
@@ -193,6 +196,17 @@
simd->setPort(dport, sigspec);
}
+ // Set parameters
+ for (const auto &it : m_DspParams) {
+ auto val_a = dsp_a->getParam(RTLIL::escape_id(it));
+ auto val_b = dsp_b->getParam(RTLIL::escape_id(it));
+
+ std::vector<RTLIL::State> bits;
+ bits.insert(bits.end(), val_a.begin(), val_a.end());
+ bits.insert(bits.end(), val_b.begin(), val_b.end());
+ simd->setParam(RTLIL::escape_id(it), RTLIL::Const(bits));
+ }
+
// Enable the fractured mode by connecting the control
// port.
simd->setPort(RTLIL::escape_id("f_mode"), RTLIL::S1);
diff --git a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
index 43b3ba2..296fc81 100644
--- a/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
+++ b/ql-qlf-plugin/qlf_k6n10f/cells_sim.v
@@ -706,13 +706,14 @@
input [5:0] shift_right,
input round,
input subtract,
- input register_inputs,
- input [19:0] coeff_0,
- input [19:0] coeff_1,
- input [19:0] coeff_2,
- input [19:0] coeff_3
+ input register_inputs
);
+ parameter [19:0] COEFF_0 = 20'd0;
+ parameter [19:0] COEFF_1 = 20'd0;
+ parameter [19:0] COEFF_2 = 20'd0;
+ parameter [19:0] COEFF_3 = 20'd0;
+
endmodule
(* blackbox *) // TODO: add sim model
@@ -737,12 +738,14 @@
input [5:0] shift_right_i,
input round_i,
input subtract_i,
- input register_inputs_i,
- input [19:0] coeff_0_i,
- input [19:0] coeff_1_i,
- input [19:0] coeff_2_i,
- input [19:0] coeff_3_i
+ input register_inputs_i
);
+
+ parameter [19:0] COEFF_0 = 20'd0;
+ parameter [19:0] COEFF_1 = 20'd0;
+ parameter [19:0] COEFF_2 = 20'd0;
+ parameter [19:0] COEFF_3 = 20'd0;
+
endmodule
(* blackbox *) // TODO: add sim model
@@ -767,10 +770,12 @@
input [5:0] shift_right_i,
input round_i,
input subtract_i,
- input register_inputs_i,
- input [ 9:0] coeff_0_i,
- input [ 9:0] coeff_1_i,
- input [ 9:0] coeff_2_i,
- input [ 9:0] coeff_3_i
+ input register_inputs_i
);
+
+ parameter [9:0] COEFF_0 = 10'd0;
+ parameter [9:0] COEFF_1 = 10'd0;
+ parameter [9:0] COEFF_2 = 10'd0;
+ parameter [9:0] COEFF_3 = 10'd0;
+
endmodule
diff --git a/ql-qlf-plugin/qlf_k6n10f/dsp_final_map.v b/ql-qlf-plugin/qlf_k6n10f/dsp_final_map.v
index 5fe905c..b8423e5 100644
--- a/ql-qlf-plugin/qlf_k6n10f/dsp_final_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/dsp_final_map.v
@@ -26,14 +26,20 @@
input [5:0] shift_right_i,
input round_i,
input subtract_i,
- input register_inputs_i,
- input [19:0] coeff_0_i,
- input [19:0] coeff_1_i,
- input [19:0] coeff_2_i,
- input [19:0] coeff_3_i
+ input register_inputs_i
);
- QL_DSP2 _TECHMAP_REPLACE_ (
+ parameter [19:0] COEFF_0 = 20'd0;
+ parameter [19:0] COEFF_1 = 20'd0;
+ parameter [19:0] COEFF_2 = 20'd0;
+ parameter [19:0] COEFF_3 = 20'd0;
+
+ QL_DSP2 # (
+ .COEFF_0 (COEFF_0),
+ .COEFF_1 (COEFF_1),
+ .COEFF_2 (COEFF_2),
+ .COEFF_3 (COEFF_3)
+ ) _TECHMAP_REPLACE_ (
.a (a_i),
.b (b_i),
.acc_fir (acc_fir_i),
@@ -54,11 +60,7 @@
.shift_right (shift_right_i),
.round (round_i),
.subtract (subtract_i),
- .register_inputs (register_inputs_i),
- .coeff_0 (coeff_0_i),
- .coeff_1 (coeff_1_i),
- .coeff_2 (coeff_2_i),
- .coeff_3 (coeff_3_i)
+ .register_inputs (register_inputs_i)
);
endmodule
@@ -91,10 +93,20 @@
input [ 9:0] coeff_3_i
);
+ parameter [9:0] COEFF_0 = 10'd0;
+ parameter [9:0] COEFF_1 = 10'd0;
+ parameter [9:0] COEFF_2 = 10'd0;
+ parameter [9:0] COEFF_3 = 10'd0;
+
wire [37:0] z;
wire [17:0] dly_b;
- QL_DSP2 _TECHMAP_REPLACE_ (
+ QL_DSP2 # (
+ .COEFF_0 ({10'd0, COEFF_0}),
+ .COEFF_1 ({10'd0, COEFF_1}),
+ .COEFF_2 ({10'd0, COEFF_2}),
+ .COEFF_3 ({10'd0, COEFF_3})
+ ) _TECHMAP_REPLACE_ (
.a ({10'd0, a_i}),
.b ({ 9'd0, b_i}),
.acc_fir (acc_fir_i),
@@ -115,11 +127,7 @@
.shift_right (shift_right_i),
.round (round_i),
.subtract (subtract_i),
- .register_inputs (register_inputs_i),
- .coeff_0 ({10'd0, coeff_0_i}),
- .coeff_1 ({10'd0, coeff_1_i}),
- .coeff_2 ({10'd0, coeff_2_i}),
- .coeff_3 ({10'd0, coeff_3_i})
+ .register_inputs (register_inputs_i)
);
assign z_o = z[18:0];
diff --git a/ql-qlf-plugin/qlf_k6n10f/dsp_map.v b/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
index 054d82a..e10df2a 100644
--- a/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
+++ b/ql-qlf-plugin/qlf_k6n10f/dsp_map.v
@@ -41,11 +41,7 @@
.shift_right_i (6'd0),
.round_i (1'b0),
.subtract_i (1'b0),
- .register_inputs_i (1'b0),
- .coeff_0_i (20'd0),
- .coeff_1_i (20'd0),
- .coeff_2_i (20'd0),
- .coeff_3_i (20'd0)
+ .register_inputs_i (1'b0)
);
assign Y = z;
@@ -87,11 +83,7 @@
.shift_right_i (6'd0),
.round_i (1'b0),
.subtract_i (1'b0),
- .register_inputs_i (1'b0),
- .coeff_0_i (10'd0),
- .coeff_1_i (10'd0),
- .coeff_2_i (10'd0),
- .coeff_3_i (10'd0)
+ .register_inputs_i (1'b0)
);
assign Y = z;