1 |
121 |
ultro |
module realign (
|
2 |
|
|
clk,
|
3 |
|
|
rstn,
|
4 |
|
|
read_req_in,write_req_in,
|
5 |
|
|
read_req_out,write_req_out,
|
6 |
|
|
|
7 |
|
|
read_ack_in,write_ack_in,
|
8 |
|
|
read_ack_out,write_ack_out,
|
9 |
|
|
|
10 |
|
|
addr_in,
|
11 |
|
|
addr_out,
|
12 |
|
|
|
13 |
|
|
read_data_in,
|
14 |
|
|
read_data_out,
|
15 |
|
|
|
16 |
|
|
write_data_in,
|
17 |
|
|
write_data_out,
|
18 |
|
|
write_sz_in,
|
19 |
|
|
write_msk_out
|
20 |
|
|
|
21 |
|
|
);
|
22 |
|
|
|
23 |
|
|
input [31:0] write_data_in ,read_data_in ,addr_in;
|
24 |
|
|
output [31:0] write_data_out,read_data_out,addr_out;
|
25 |
|
|
input rstn,clk;
|
26 |
|
|
input read_req_in,write_req_in,read_ack_in,write_ack_in;
|
27 |
|
|
input [1:0] write_sz_in;
|
28 |
|
|
output [3:0] write_msk_out;
|
29 |
|
|
output write_req_out,read_req_out,read_ack_out,write_ack_out;
|
30 |
|
|
|
31 |
|
|
reg write_req_ff, write_ack_ff, read_req_ff, read_ack_ff;
|
32 |
|
|
reg [31:0] addr_out_ff;
|
33 |
|
|
reg even;
|
34 |
|
|
reg [31:0] read_data_sav;
|
35 |
|
|
reg [31:0] read_data_out_ff,write_data_out_ff;
|
36 |
|
|
reg [3:0] write_msk_ff;
|
37 |
|
|
|
38 |
|
|
wire not_align = ((addr_in[1] == 1'b1) || (addr_in[0] == 1'b1)) ? 1'b1 : 1'b0;
|
39 |
|
|
|
40 |
|
|
assign read_req_out = not_align ? read_req_ff : read_req_in;
|
41 |
|
|
assign read_ack_out = not_align ? read_ack_ff : read_ack_in;
|
42 |
|
|
|
43 |
|
|
assign write_req_out = ((not_align == 1'b1) && (write_sz_in !=2'b00)) ? write_req_ff : write_req_in;
|
44 |
|
|
assign write_ack_out = ((not_align == 1'b1) && (write_sz_in !=2'b00)) ? write_ack_ff : write_ack_in;
|
45 |
|
|
|
46 |
|
|
assign write_msk_out = ((not_align == 1'b1) && (write_sz_in != 2'b00)) ? write_msk_ff :
|
47 |
|
|
((addr_in[1:0] == 2'b00) && (write_sz_in == 2'b00)) ? 4'b0001 :
|
48 |
|
|
((addr_in[1:0] == 2'b01) && (write_sz_in == 2'b00)) ? 4'b0010 :
|
49 |
|
|
((addr_in[1:0] == 2'b10) && (write_sz_in == 2'b00)) ? 4'b0100 :
|
50 |
|
|
((addr_in[1:0] == 2'b11) && (write_sz_in == 2'b00)) ? 4'b1000 :
|
51 |
|
|
(write_sz_in == 2'b01) ? 4'b0011 :
|
52 |
|
|
4'b1111 ;
|
53 |
|
|
|
54 |
|
|
assign write_data_out = ((not_align == 1'b1) && (write_sz_in != 2'b00)) ? write_data_out_ff :
|
55 |
|
|
((addr_in[1:0] == 2'b01) && (write_sz_in == 2'b00)) ? {16'h5555,write_data_in[7:0],8'h55} :
|
56 |
|
|
((addr_in[1:0] == 2'b10) && (write_sz_in == 2'b00)) ? { 8'h55,write_data_in[7:0],16'h5555} :
|
57 |
|
|
((addr_in[1:0] == 2'b11) && (write_sz_in == 2'b00)) ? { write_data_in[7:0],24'h555555} :
|
58 |
|
|
write_data_in;
|
59 |
|
|
|
60 |
|
|
assign read_data_out = not_align ? read_data_out_ff : read_data_in;
|
61 |
|
|
|
62 |
|
|
assign addr_out = ((not_align == 1'b1) && ( read_req_in == 1'b1)) ? addr_out_ff :
|
63 |
|
|
((not_align == 1'b1) && (write_req_in == 1'b1) && (write_sz_in !=2'b00)) ? addr_out_ff :
|
64 |
|
|
{addr_in[31:2],2'b00};
|
65 |
|
|
|
66 |
|
|
always @(posedge clk or negedge rstn)
|
67 |
|
|
if (~rstn)
|
68 |
|
|
begin
|
69 |
|
|
write_req_ff <= 1'b0;
|
70 |
|
|
write_ack_ff <= 1'b0;
|
71 |
|
|
read_req_ff <= 1'b0;
|
72 |
|
|
read_ack_ff <= 1'b0;
|
73 |
|
|
even <= 1'b0;
|
74 |
|
|
write_msk_ff <= 4'b1111;
|
75 |
|
|
read_data_out_ff <= 32'h0;
|
76 |
|
|
write_data_out_ff <= 32'h0;
|
77 |
|
|
end
|
78 |
|
|
else
|
79 |
|
|
begin
|
80 |
|
|
if (write_ack_ff == 1'b1)
|
81 |
|
|
begin
|
82 |
|
|
write_req_ff <= 1'b0;
|
83 |
|
|
write_ack_ff <= 1'b0;
|
84 |
|
|
even <= 1'b0;
|
85 |
|
|
write_msk_ff <= 4'b0000;
|
86 |
|
|
end
|
87 |
|
|
else if (read_ack_ff == 1'b1)
|
88 |
|
|
begin
|
89 |
|
|
read_req_ff <= 1'b0;
|
90 |
|
|
read_ack_ff <= 1'b0;
|
91 |
|
|
even <= 1'b0;
|
92 |
|
|
end
|
93 |
|
|
else
|
94 |
|
|
if ((not_align == 1'b1) && (read_req_ff == 1'b0) && (read_req_in == 1'b1) && (even == 1'b0))
|
95 |
|
|
begin
|
96 |
|
|
read_req_ff <= 1'b1;
|
97 |
|
|
addr_out_ff <= {addr_in[31:2],2'b00};
|
98 |
|
|
even <= 1'b1;
|
99 |
|
|
end
|
100 |
|
|
else
|
101 |
|
|
if ((not_align == 1'b1) && (read_req_ff == 1'b1) && (read_ack_in == 1'b1) && (even == 1'b1))
|
102 |
|
|
begin
|
103 |
|
|
addr_out_ff <= {addr_in[31:2],2'b00} + 3'b100;
|
104 |
|
|
read_data_sav<= read_data_in;
|
105 |
|
|
even <= 1'b0;
|
106 |
|
|
end
|
107 |
|
|
else
|
108 |
|
|
if ((not_align == 1'b1) && (read_req_ff == 1'b1) && (read_ack_in == 1'b1) && (even == 1'b0))
|
109 |
|
|
begin
|
110 |
|
|
even <= 1'b0;
|
111 |
|
|
read_ack_ff <= 1'b1;
|
112 |
|
|
read_req_ff <= 1'b0;
|
113 |
|
|
case(addr_in[1:0])
|
114 |
|
|
2'b00: read_data_out_ff <= read_data_sav;
|
115 |
|
|
2'b01: read_data_out_ff <= {read_data_in[ 7:0],read_data_sav[31: 8]};
|
116 |
|
|
2'b10: read_data_out_ff <= {read_data_in[15:0],read_data_sav[31:16]};
|
117 |
|
|
2'b11: read_data_out_ff <= {read_data_in[23:0],read_data_sav[31:24]};
|
118 |
|
|
endcase
|
119 |
|
|
end
|
120 |
|
|
else
|
121 |
|
|
if ((not_align == 1'b1) && (write_req_ff == 1'b0) && (write_req_in == 1'b1) && (even == 1'b0) && (write_sz_in != 2'b00))
|
122 |
|
|
begin
|
123 |
|
|
addr_out_ff <= {addr_in[31:2],2'b00};
|
124 |
|
|
even <= 1'b1;
|
125 |
|
|
write_req_ff <= 1'b1;
|
126 |
|
|
if ((addr_in[1:0] == 2'b01) && (write_sz_in ==2'b01)) begin write_msk_ff <= 4'b0110; write_data_out_ff <= {write_data_in[23:0], 8'b0}; end else
|
127 |
|
|
if ((addr_in[1:0] == 2'b01) && (write_sz_in ==2'b10)) begin write_msk_ff <= 4'b1110; write_data_out_ff <= {write_data_in[23:0], 8'b0}; end else
|
128 |
|
|
if ((addr_in[1:0] == 2'b10) && (write_sz_in ==2'b01)) begin write_msk_ff <= 4'b1100; write_data_out_ff <= {write_data_in[15:0],16'b0}; end else
|
129 |
|
|
if ((addr_in[1:0] == 2'b10) && (write_sz_in ==2'b10)) begin write_msk_ff <= 4'b1100; write_data_out_ff <= {write_data_in[15:0],16'b0}; end else
|
130 |
|
|
if ((addr_in[1:0] == 2'b11) && (write_sz_in ==2'b01)) begin write_msk_ff <= 4'b1000; write_data_out_ff <= {write_data_in[ 7:0],24'b0}; end else
|
131 |
|
|
if ((addr_in[1:0] == 2'b11) && (write_sz_in ==2'b10)) begin write_msk_ff <= 4'b1000; write_data_out_ff <= {write_data_in[ 7:0],24'b0}; end
|
132 |
|
|
end
|
133 |
|
|
else
|
134 |
|
|
if ((not_align == 1'b1) && (write_req_ff == 1'b1) && (write_ack_in == 1'b1) && (even == 1'b1))
|
135 |
|
|
begin
|
136 |
|
|
addr_out_ff <= {addr_in[31:2],2'b00} + 3'b100;
|
137 |
|
|
even <= 1'b0;
|
138 |
|
|
if ((addr_in[1:0] == 2'b01) && (write_sz_in ==2'b10)) begin write_msk_ff <= 4'b0001; write_data_out_ff <= {24'b0,write_data_in[31:24]}; end else
|
139 |
|
|
if ((addr_in[1:0] == 2'b10) && (write_sz_in ==2'b10)) begin write_msk_ff <= 4'b0011; write_data_out_ff <= {16'b0,write_data_in[31:16]}; end else
|
140 |
|
|
if ((addr_in[1:0] == 2'b11) && (write_sz_in ==2'b01)) begin write_msk_ff <= 4'b0001; write_data_out_ff <= { 8'b0,write_data_in[31: 8]}; end else
|
141 |
|
|
if ((addr_in[1:0] == 2'b11) && (write_sz_in ==2'b10)) begin write_msk_ff <= 4'b0111; write_data_out_ff <= { 8'b0,write_data_in[31: 8]}; end else
|
142 |
|
|
begin write_msk_ff <= 4'b0000; end
|
143 |
|
|
end
|
144 |
|
|
else
|
145 |
|
|
if ((not_align == 1'b1) && (write_req_ff == 1'b1) && (write_ack_in == 1'b1) && (even == 1'b0))
|
146 |
|
|
begin
|
147 |
|
|
even <= 1'b0;
|
148 |
|
|
write_ack_ff <= 1'b1;
|
149 |
|
|
write_req_ff <= 1'b0;
|
150 |
|
|
end
|
151 |
|
|
end
|
152 |
|
|
|
153 |
|
|
endmodule
|