Skip to content

Commit 0c40114

Browse files
committed
update to frontend
1 parent 74df5be commit 0c40114

File tree

6 files changed

+996
-0
lines changed

6 files changed

+996
-0
lines changed

src/defs.v

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
`ifndef DEFS_GUARD
2+
`define DEFS_GUARD
3+
4+
`define PHASE_MODE 0
5+
`define SCAN_MODE 1
6+
7+
`endif

src/scan_cell_2ph.v

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Single Scan Cell with Two-Phase Clock
2+
3+
`ifndef SCAN_CELL_2PH_GUARD
4+
`define SCAN_CELL_2PH_GUARD
5+
`include "defs.v"
6+
7+
module scan_cell_2ph (
8+
input wire phi1, // Phase 1 clock read into clock A
9+
input wire phi2, // Phase 2 clock read out of clock B
10+
input wire rst_n, // Reset
11+
input wire scan_in, // Scan data input
12+
input wire data_in, // Functional data input
13+
input wire scan_enable, // Scan mode enable
14+
input wire scan_mode, //0 for scan in, 1 for data
15+
output reg data_out, // Functional data output
16+
output reg scan_out
17+
);
18+
19+
// Internal ffs
20+
reg primary_ff;
21+
reg secondary_ff;
22+
23+
always @(posedge phi1 or negedge rst_n) begin
24+
if (!rst_n)
25+
primary_ff <= 1'b0;
26+
else if (scan_enable) begin
27+
if (scan_mode)
28+
primary_ff <= scan_in;
29+
else
30+
primary_ff <= secondary_ff;
31+
end
32+
end
33+
34+
always @(posedge phi2 or negedge rst_n) begin
35+
if (!rst_n)
36+
secondary_ff <= 1'b0;
37+
else if (scan_enable) begin
38+
if (scan_mode)
39+
secondary_ff <= primary_ff;
40+
else
41+
secondary_ff <= data_in;
42+
end
43+
end
44+
45+
// Outputs
46+
always @(*) begin
47+
data_out = secondary_ff;
48+
scan_out = secondary_ff;
49+
end
50+
51+
endmodule
52+
`endif

src/scan_chain_2ph.v

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// Two-Phase Clock Scan Chain (8-bit example)
2+
`ifndef SCAN_CHAIN_2PH_GUARD
3+
`define SCAN_CHAIN_2PH_GUARD
4+
`include "scan_cell_2ph.v"
5+
6+
module scan_chain_2ph #(
7+
parameter CHAIN_LENGTH = 8
8+
) (
9+
input wire phi1, //clk A
10+
input wire phi2, //clk B
11+
input wire rst_n,
12+
input wire scan_enable,
13+
input wire scan_mode,
14+
input wire scan_in,
15+
input wire [CHAIN_LENGTH-1:0] data_in, //clk A
16+
output wire scan_out, //clk B
17+
output wire [CHAIN_LENGTH-1:0] data_out //clkb B
18+
);
19+
20+
// Internal signals
21+
22+
wire [CHAIN_LENGTH:0] scan_chain;
23+
24+
// Connect scan chain input
25+
assign scan_chain[0] = scan_in;
26+
assign scan_out = scan_chain[CHAIN_LENGTH];
27+
28+
// Generate scan cells
29+
genvar i;
30+
generate
31+
for (i = 0; i < CHAIN_LENGTH; i = i + 1) begin : scan_cells
32+
scan_cell_2ph scan_cell(
33+
.phi1(phi1),
34+
.phi2(phi2),
35+
.rst_n(rst_n),
36+
.scan_in(scan_chain[i]),
37+
.data_in(data_in[i]),
38+
.scan_enable(scan_enable),
39+
.scan_mode(scan_mode),
40+
.scan_out(scan_chain[i+1]),
41+
.data_out(data_out[i])
42+
);
43+
end
44+
endgenerate
45+
46+
endmodule
47+
48+
`endif
7.14 MB
Binary file not shown.

0 commit comments

Comments
 (0)