mirror of
https://github.com/YosysHQ/yosys
synced 2025-08-03 09:50:24 +00:00
intel_alm: ABC9 sequential optimisations
This commit is contained in:
parent
a9b61080a4
commit
83cde2d02b
7 changed files with 149 additions and 19 deletions
18
techlibs/intel_alm/common/abc9_map.v
Normal file
18
techlibs/intel_alm/common/abc9_map.v
Normal file
|
@ -0,0 +1,18 @@
|
|||
// This file exists to map purely-synchronous flops to ABC9 flops, while
|
||||
// mapping flops with asynchronous-clear as boxes, this is because ABC9
|
||||
// doesn't support asynchronous-clear flops in sequential synthesis.
|
||||
|
||||
module MISTRAL_FF(
|
||||
input DATAIN, CLK, ACLR, ENA, SCLR, SLOAD, SDATA,
|
||||
output reg Q
|
||||
);
|
||||
|
||||
parameter _TECHMAP_CONSTMSK_ACLR_ = 1'b0;
|
||||
|
||||
// If the async-clear is constant, we assume it's disabled.
|
||||
if (_TECHMAP_CONSTMSK_ACLR_ != 1'b0)
|
||||
MISTRAL_FF_SYNCONLY _TECHMAP_REPLACE_ (.DATAIN(DATAIN), .CLK(CLK), .ENA(ENA), .SCLR(SCLR), .SLOAD(SLOAD), .SDATA(SDATA), .Q(Q));
|
||||
else
|
||||
wire _TECHMAP_FAIL_ = 1;
|
||||
|
||||
endmodule
|
55
techlibs/intel_alm/common/abc9_model.v
Normal file
55
techlibs/intel_alm/common/abc9_model.v
Normal file
|
@ -0,0 +1,55 @@
|
|||
`ifdef cyclonev
|
||||
`define SYNCPATH 262
|
||||
`define SYNCSETUP 522
|
||||
`define COMBPATH 0
|
||||
`endif
|
||||
`ifdef cyclone10gx
|
||||
`define SYNCPATH 219
|
||||
`define SYNCSETUP 268
|
||||
`define COMBPATH 0
|
||||
`endif
|
||||
|
||||
// fallback for when a family isn't detected (e.g. when techmapping for equivalence)
|
||||
`ifndef SYNCPATH
|
||||
`define SYNCPATH 0
|
||||
`define SYNCSETUP 0
|
||||
`define COMBPATH 0
|
||||
`endif
|
||||
|
||||
// This is a purely-synchronous flop, that ABC9 can use for sequential synthesis.
|
||||
(* abc9_flop, lib_whitebox *)
|
||||
module MISTRAL_FF_SYNCONLY(
|
||||
input DATAIN, CLK, ENA, SCLR, SLOAD, SDATA,
|
||||
output reg Q
|
||||
);
|
||||
|
||||
specify
|
||||
if (ENA) (posedge CLK => (Q : DATAIN)) = `SYNCPATH;
|
||||
if (ENA) (posedge CLK => (Q : SCLR)) = `SYNCPATH;
|
||||
if (ENA) (posedge CLK => (Q : SLOAD)) = `SYNCPATH;
|
||||
if (ENA) (posedge CLK => (Q : SDATA)) = `SYNCPATH;
|
||||
|
||||
$setup(DATAIN, posedge CLK, `SYNCSETUP);
|
||||
$setup(ENA, posedge CLK, `SYNCSETUP);
|
||||
$setup(SCLR, posedge CLK, `SYNCSETUP);
|
||||
$setup(SLOAD, posedge CLK, `SYNCSETUP);
|
||||
$setup(SDATA, posedge CLK, `SYNCSETUP);
|
||||
endspecify
|
||||
|
||||
initial begin
|
||||
// Altera flops initialise to zero.
|
||||
Q = 0;
|
||||
end
|
||||
|
||||
always @(posedge CLK) begin
|
||||
// Clock-enable
|
||||
if (ENA) begin
|
||||
// Synchronous clear
|
||||
if (SCLR) Q <= 0;
|
||||
// Synchronous load
|
||||
else if (SLOAD) Q <= SDATA;
|
||||
else Q <= DATAIN;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
11
techlibs/intel_alm/common/abc9_unmap.v
Normal file
11
techlibs/intel_alm/common/abc9_unmap.v
Normal file
|
@ -0,0 +1,11 @@
|
|||
// After performing sequential synthesis, map the synchronous flops back to
|
||||
// standard MISTRAL_FF flops.
|
||||
|
||||
module MISTRAL_FF_SYNCONLY(
|
||||
input DATAIN, CLK, ENA, SCLR, SLOAD, SDATA,
|
||||
output reg Q
|
||||
);
|
||||
|
||||
MISTRAL_FF _TECHMAP_REPLACE_ (.DATAIN(DATAIN), .CLK(CLK), .ACLR(1'b1), .ENA(ENA), .SCLR(SCLR), .SLOAD(SLOAD), .SDATA(SDATA), .Q(Q));
|
||||
|
||||
endmodule
|
|
@ -53,23 +53,45 @@
|
|||
// Q: data output
|
||||
//
|
||||
// Note: the DFFEAS primitive is mostly emulated; it does not reflect what the hardware implements.
|
||||
|
||||
`ifdef cyclonev
|
||||
`define SYNCPATH 262
|
||||
`define SYNCSETUP 522
|
||||
`define COMBPATH 0
|
||||
`endif
|
||||
`ifdef cyclone10gx
|
||||
`define SYNCPATH 219
|
||||
`define SYNCSETUP 268
|
||||
`define COMBPATH 0
|
||||
`endif
|
||||
|
||||
// fallback for when a family isn't detected (e.g. when techmapping for equivalence)
|
||||
`ifndef SYNCPATH
|
||||
`define SYNCPATH 0
|
||||
`define SYNCSETUP 0
|
||||
`define COMBPATH 0
|
||||
`endif
|
||||
|
||||
(* abc9_box, lib_whitebox *)
|
||||
module MISTRAL_FF(
|
||||
input DATAIN, CLK, ACLR, ENA, SCLR, SLOAD, SDATA,
|
||||
output reg Q
|
||||
);
|
||||
|
||||
`ifdef cyclonev
|
||||
specify
|
||||
(posedge CLK => (Q : DATAIN)) = 262;
|
||||
$setup(DATAIN, posedge CLK, 522);
|
||||
if (ENA) (posedge CLK => (Q : DATAIN)) = `SYNCPATH;
|
||||
if (ENA) (posedge CLK => (Q : SCLR)) = `SYNCPATH;
|
||||
if (ENA) (posedge CLK => (Q : SLOAD)) = `SYNCPATH;
|
||||
if (ENA) (posedge CLK => (Q : SDATA)) = `SYNCPATH;
|
||||
|
||||
$setup(DATAIN, posedge CLK, `SYNCSETUP);
|
||||
$setup(ENA, posedge CLK, `SYNCSETUP);
|
||||
$setup(SCLR, posedge CLK, `SYNCSETUP);
|
||||
$setup(SLOAD, posedge CLK, `SYNCSETUP);
|
||||
$setup(SDATA, posedge CLK, `SYNCSETUP);
|
||||
|
||||
(ACLR => Q) = `COMBPATH;
|
||||
endspecify
|
||||
`endif
|
||||
`ifdef cyclone10gx
|
||||
specify
|
||||
(posedge CLK => (Q : DATAIN)) = 219;
|
||||
$setup(DATAIN, posedge CLK, 268);
|
||||
endspecify
|
||||
`endif
|
||||
|
||||
initial begin
|
||||
// Altera flops initialise to zero.
|
||||
|
|
|
@ -48,10 +48,20 @@
|
|||
// the following model because it's very difficult to trigger this in practice
|
||||
// as clock cycles will be much longer than any potential blip of 'x, so the
|
||||
// model can be treated as always returning a defined result.
|
||||
|
||||
(* abc9_box, lib_whitebox *)
|
||||
module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1ADDR, output B1DATA);
|
||||
|
||||
reg [31:0] mem = 32'b0;
|
||||
|
||||
// TODO
|
||||
specify
|
||||
$setup(A1ADDR, posedge CLK1, 0);
|
||||
$setup(A1DATA, posedge CLK1, 0);
|
||||
|
||||
(B1ADDR *> B1DATA) = 0;
|
||||
endspecify
|
||||
|
||||
always @(posedge CLK1)
|
||||
if (A1EN) mem[A1ADDR] <= A1DATA;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue