Skip to content

Commit b3a944e

Browse files
committed
Add ex02 files
1 parent fb59f5b commit b3a944e

File tree

7 files changed

+677
-0
lines changed

7 files changed

+677
-0
lines changed

ex02/ex_BD_basic_principles.odp

193 KB
Binary file not shown.

ex02/ex_BD_symbol_library.xml

Lines changed: 80 additions & 0 deletions
Large diffs are not rendered by default.

ex02/sourcecode/cdc_2phase.sv

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright 2024 ETH Zurich and University of Bologna.
2+
// Solderpad Hardware License, Version 0.51, see LICENSE for details.
3+
// SPDX-License-Identifier: SHL-0.51
4+
5+
module cdc_2phase (
6+
input logic scr_clk_i,
7+
input logic scr_valid_i,
8+
output logic scr_ready_o,
9+
10+
input logic dst_clk_i,
11+
output logic dst_valid_o,
12+
input logic dst_ready_i
13+
);
14+
15+
logic async_req;
16+
logic async_ack;
17+
18+
logic src_req_q, src_ack_q;
19+
logic dst_req_q, dst_ack_q;
20+
21+
always_ff @(posedge scr_clk_i) begin
22+
src_ack_q <= async_ack;
23+
end
24+
25+
always_ff @(posedge dst_clk_i) begin
26+
dst_req_q <= async_req;
27+
end
28+
29+
always_ff @(posedge scr_clk_i) begin
30+
if (scr_valid_i && scr_ready_o) begin
31+
src_req_q <= ~src_req_q;
32+
end
33+
end
34+
35+
always_ff @(posedge dst_clk_i) begin
36+
if (dst_valid_o && dst_ready_i) begin
37+
dst_ack_q <= ~dst_ack_q;
38+
end
39+
end
40+
41+
assign scr_ready_o = (src_req_q == src_ack_q);
42+
assign dst_valid_o = (dst_ack_q != dst_req_q);
43+
assign async_req = src_req_q;
44+
assign async_ack = dst_ack_q;
45+
46+
endmodule

ex02/sourcecode/crc_hasher.sv

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright 2024 ETH Zurich and University of Bologna.
2+
// Solderpad Hardware License, Version 0.51, see LICENSE for details.
3+
// SPDX-License-Identifier: SHL-0.51
4+
5+
module crc_hasher (
6+
input clk_i,
7+
input rst_ni,
8+
input [7:0] data_i,
9+
input valid_i,
10+
output ready_o,
11+
input clear_i,
12+
output [7:0] hash_o
13+
);
14+
15+
logic enable, sel, ready;
16+
logic [7:0] data_in, data_out;
17+
18+
crc_lfsr i_lfsr (
19+
.rst_ni ( rst_ni ),
20+
.clk_i ( clk_i ),
21+
.en_i ( enable ),
22+
.data_i ( data_in ),
23+
.data_o ( data_out )
24+
);
25+
26+
assign data_in = sel ? (data_i ^ data_out) : 8'b00000001;
27+
assign hash_o = data_out;
28+
assign ready_o = ready;
29+
30+
always_comb begin
31+
ready = 1'b1;
32+
enable = valid_i;
33+
sel = 1'b1;
34+
if(clear_i==1'b1) begin
35+
ready = 1'b0;
36+
enable = 1'b1;
37+
sel = 1'b0;
38+
end
39+
end
40+
41+
endmodule

ex02/sourcecode/crc_lfsr.sv

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright 2024 ETH Zurich and University of Bologna.
2+
// Solderpad Hardware License, Version 0.51, see LICENSE for details.
3+
// SPDX-License-Identifier: SHL-0.51
4+
5+
module crc_lfsr (
6+
input rst_ni,
7+
input clk_i,
8+
input en_i,
9+
input [7:0] data_i,
10+
output [7:0] data_o
11+
);
12+
13+
logic [7:0] data_d, data_q;
14+
15+
assign data_d = data_i;
16+
assign data_o[7:1] = data_q[6:0];
17+
assign data_o[0] = data_q[7] ^ (data_q[5] ^ (data_q[4] ^ data_q[3]));
18+
19+
always_ff @(posedge clk_i, negedge rst_ni) begin
20+
if (rst_ni == 0) begin
21+
data_q = 0;
22+
end else begin
23+
if(en_i == 1'b1) data_q = data_d;
24+
end
25+
end
26+
27+
endmodule

ex02/sourcecode/crc_stream.sv

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Copyright 2024 ETH Zurich and University of Bologna.
2+
// Solderpad Hardware License, Version 0.51, see LICENSE for details.
3+
// SPDX-License-Identifier: SHL-0.51
4+
5+
module crc_stream (
6+
input rst_ni,
7+
input clk_i,
8+
9+
input [7:0] data_i,
10+
input last_i,
11+
input valid_i,
12+
output ready_o,
13+
14+
output [7:0] data_o,
15+
output last_o,
16+
output valid_o,
17+
input ready_i
18+
);
19+
20+
typedef enum {init, data, append} state_t;
21+
state_t state_d, state_q;
22+
logic lfsr_valid, lfsr_ready, lfsr_clear, out_sel;
23+
logic [7:0] hash_data;
24+
25+
logic last_out, valid_out, ready_out;
26+
27+
assign last_o = last_out;
28+
assign valid_o = valid_out;
29+
assign ready_o = ready_out;
30+
31+
crc_hasher i_hasher (
32+
.rst_ni ( rst_ni ),
33+
.clk_i ( clk_i ),
34+
.data_i ( data_i ),
35+
.valid_i ( lfsr_valid ),
36+
.ready_o ( lfsr_ready ),
37+
.clear_i ( lfsr_clear ),
38+
.hash_o ( hash_data )
39+
);
40+
41+
assign data_o = ~out_sel ? data_i : hash_data;
42+
43+
always_ff @(posedge clk_i, negedge rst_ni) begin
44+
if (rst_ni == 0) begin
45+
state_q = init;
46+
end else begin
47+
state_q = state_d;
48+
end
49+
end
50+
51+
always_comb begin
52+
state_d = state_q;
53+
54+
lfsr_valid = 0;
55+
lfsr_clear = 0;
56+
out_sel = 0;
57+
58+
last_out = 0;
59+
valid_out = 0;
60+
ready_out = 0;
61+
62+
case(state_q)
63+
init: begin
64+
lfsr_clear = 1'b1;
65+
state_d = data;
66+
end
67+
68+
data: begin
69+
valid_out = valid_i & ready_i & lfsr_ready;
70+
lfsr_valid = valid_i & ready_i;
71+
ready_out = ready_i & lfsr_ready;
72+
if((valid_i & ready_i & lfsr_ready & last_i) == 1'b1) begin
73+
state_d = append;
74+
end
75+
end
76+
append: begin
77+
out_sel = 1;
78+
last_out = 1;
79+
valid_out = 1;
80+
if(ready_i == 1) begin
81+
state_d = init;
82+
end
83+
end
84+
default: begin end
85+
endcase
86+
end
87+
88+
endmodule

0 commit comments

Comments
 (0)