@@ -28,30 +28,34 @@ module width_converter_8toN #(
28
28
29
29
// Number of bytes of wider data bus
30
30
localparam int unsigned Bytes = Width / 8 ;
31
+ localparam int unsigned BytesW = $clog2 (Bytes);
31
32
32
33
// Byte counter
33
- logic [$clog2 (Bytes): 0 ] bcnt;
34
+ logic [BytesW: 0 ] bcnt;
35
+ logic [BytesW: 0 ] s_bytes;
36
+
37
+ assign s_bytes = (BytesW+ 1 )'(Bytes);
34
38
35
39
always_ff @ (posedge clk_i or negedge rst_ni)
36
40
if (! rst_ni) bcnt <= '0 ;
37
41
else begin
38
- if ((bcnt != '0 ) & sink_flush_i) bcnt <= Bytes ;
39
- else if ((bcnt != Bytes ) & sink_valid_i & sink_ready_o) bcnt <= bcnt + 1 ;
40
- else if ((bcnt == Bytes ) & source_valid_o & source_ready_i) bcnt <= '0 ;
42
+ if ((bcnt != '0 ) & sink_flush_i) bcnt <= s_bytes ;
43
+ else if ((bcnt != s_bytes ) & sink_valid_i & sink_ready_o) bcnt <= bcnt + 1 ;
44
+ else if ((bcnt == s_bytes ) & source_valid_o & source_ready_i) bcnt <= '0 ;
41
45
end
42
46
43
47
// Valid / ready
44
- assign sink_ready_o = (bcnt != Bytes );
45
- assign source_valid_o = (bcnt == Bytes );
48
+ assign sink_ready_o = (bcnt != s_bytes );
49
+ assign source_valid_o = (bcnt == s_bytes );
46
50
47
51
// Data register
48
52
logic [Width- 1 : 0 ] sreg;
49
53
50
54
always_ff @ (posedge clk_i or negedge rst_ni)
51
55
if (! rst_ni) sreg <= '0 ;
52
56
else begin
53
- if ((bcnt != Bytes ) & sink_valid_i & sink_ready_o) sreg[bcnt* 8 + : 8 ] <= sink_data_i;
54
- else if ((bcnt == Bytes ) & source_valid_o & source_ready_i)
57
+ if ((bcnt != s_bytes ) & sink_valid_i & sink_ready_o) sreg[bcnt* 8 + : 8 ] <= sink_data_i;
58
+ else if ((bcnt == s_bytes ) & source_valid_o & source_ready_i)
55
59
sreg <= '0 ; // Clear the reg not to leak data
56
60
end
57
61
0 commit comments