Compare commits

...

3 commits

Author SHA1 Message Date
Retrocamara42
3957306d86 fix: fifo wr ptr error, arbiter indexes for paths fixed, small bugs 2025-06-15 06:20:01 -05:00
Retrocamara42
a7e725ee99 fix: error in test when assigning send_ack 2025-06-12 15:45:08 -05:00
Retrocamara42
9d47e04a0c fix: avai paths error fixed 2025-06-12 15:14:03 -05:00
18 changed files with 25398 additions and 1051 deletions

View file

@ -39,4 +39,5 @@ FIFO5 -> U -> Upstream
![alt text](./drawings/router.png)
# TODO: delete line where header is compared to 1
# TODO: do throttle (many same data points) testw
# TODO: do throttle (many same data points) testw
# TODO: run simulation again, observing router L5

View file

@ -50,28 +50,6 @@ begin
end loop;
end process;
-- g_L5_ROUT_DIR_PROC: if level = 5 generate
-- L5_get_rout_dir: process(rout_pos, packets)
-- variable pack_dest : t_pos_addr;
-- variable header : std_logic_vector(3 downto 0);
-- begin
-- for i in 0 to packets'length-1 loop
-- header := packets(i)(63 downto 60);
-- if header(0) = '1' then
-- pack_dest.chip_x := packets(i)(59 downto 55);
-- pack_dest.chip_y := packets(i)(54 downto 50);
-- pack_dest.core_x := packets(i)(49 downto 45);
-- pack_dest.core_y := packets(i)(44 downto 40);
-- pack_dest.copy_x := packets(i)(39 downto 35);
-- pack_dest.copy_y := packets(i)(34 downto 30);
-- dirs(i) <= L5_single_packet_rout_dir_det(level, pack_dest, rout_pos);
-- else
-- dirs(i) <= (others => '0');
-- end if;
-- end loop;
-- end process;
-- end generate;
rout_path_determination: process(packets, dirs, avai_paths)
variable sum_dirs : integer;
variable j : integer;
@ -139,45 +117,55 @@ begin
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
end if;
if avai_pos_sizes(j) > 0 then
avai_pos_sizes(j) := avai_pos_sizes(j)-1;
end if;
-- 1 to 2 multicast
elsif sum_dirs = 2 then
if dirs(i)(2) = '1' and dirs(i)(4) = '1' then
if avai_pos_sizes(2) <= 0 or avai_pos_sizes(4) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
end if;
elsif dirs(i)(1) = '1' and dirs(i)(3) = '1' then
if dirs(i)(1) = '1' and dirs(i)(3) = '1' then
if avai_pos_sizes(1) <= 0 or avai_pos_sizes(3) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(1) := avai_pos_sizes(1)-1;
avai_pos_sizes(3) := avai_pos_sizes(3)-1;
end if;
elsif dirs(i)(3) = '1' and dirs(i)(4) = '1' then
if avai_pos_sizes(3) <= 0 or avai_pos_sizes(4) <= 0 then
elsif dirs(i)(0) = '1' and dirs(i)(2) = '1' then
if avai_pos_sizes(0) <= 0 or avai_pos_sizes(2) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(0) := avai_pos_sizes(0)-1;
avai_pos_sizes(2) := avai_pos_sizes(2)-1;
end if;
elsif dirs(i)(2) = '1' and dirs(i)(3) = '1' then
if avai_pos_sizes(2) <= 0 or avai_pos_sizes(3) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(2) := avai_pos_sizes(2)-1;
avai_pos_sizes(3) := avai_pos_sizes(3)-1;
end if;
--elsif dirs(i)(1) = '1' and dirs(i)(2) = '1' then
else
if avai_pos_sizes(1) <= 0 or avai_pos_sizes(2) <= 0 then
if avai_pos_sizes(0) <= 0 or avai_pos_sizes(1) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(0) := avai_pos_sizes(0)-1;
avai_pos_sizes(1) := avai_pos_sizes(1)-1;
end if;
end if;
-- 1 to 4 multicast
elsif sum_dirs = 4 then
if avai_pos_sizes(1) <= 0 or avai_pos_sizes(2) <= 0 or
avai_pos_sizes(3) <= 0 or avai_pos_sizes(4) <= 0 then
if avai_pos_sizes(0) <= 0 or avai_pos_sizes(1) <= 0 or
avai_pos_sizes(2) <= 0 or avai_pos_sizes(3) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(0) := avai_pos_sizes(0)-1;
avai_pos_sizes(1) := avai_pos_sizes(1)-1;
avai_pos_sizes(2) := avai_pos_sizes(2)-1;
avai_pos_sizes(3) := avai_pos_sizes(3)-1;
end if;
else
ps_dirs(i) <= (others => '0');

View file

@ -63,7 +63,7 @@ begin
fifo_sel <= (others => '0');
if wr_req = '1' then
one := to_unsigned(1, DEPTH);
fifo_sel <= std_logic_vector(shift_left(one, to_integer(wr_ptr)));
fifo_sel <= std_logic_vector(shift_left(one, to_integer(wr_ptr(F_PTR_SIZE-2 downto 0))));
end if;
end process;

View file

@ -140,45 +140,55 @@ begin
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
end if;
if avai_pos_sizes(j) > 0 then
avai_pos_sizes(j) := avai_pos_sizes(j)-1;
end if;
-- 1 to 2 multicast
elsif sum_dirs = 2 then
if dirs(i)(2) = '1' and dirs(i)(4) = '1' then
if avai_pos_sizes(2) <= 0 or avai_pos_sizes(4) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
end if;
elsif dirs(i)(1) = '1' and dirs(i)(3) = '1' then
if dirs(i)(1) = '1' and dirs(i)(3) = '1' then
if avai_pos_sizes(1) <= 0 or avai_pos_sizes(3) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(1) := avai_pos_sizes(1)-1;
avai_pos_sizes(3) := avai_pos_sizes(3)-1;
end if;
elsif dirs(i)(3) = '1' and dirs(i)(4) = '1' then
if avai_pos_sizes(3) <= 0 or avai_pos_sizes(4) <= 0 then
elsif dirs(i)(0) = '1' and dirs(i)(2) = '1' then
if avai_pos_sizes(0) <= 0 or avai_pos_sizes(2) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(0) := avai_pos_sizes(0)-1;
avai_pos_sizes(2) := avai_pos_sizes(2)-1;
end if;
elsif dirs(i)(2) = '1' and dirs(i)(3) = '1' then
if avai_pos_sizes(2) <= 0 or avai_pos_sizes(3) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(2) := avai_pos_sizes(2)-1;
avai_pos_sizes(3) := avai_pos_sizes(3)-1;
end if;
--elsif dirs(i)(1) = '1' and dirs(i)(2) = '1' then
else
if avai_pos_sizes(1) <= 0 or avai_pos_sizes(2) <= 0 then
if avai_pos_sizes(0) <= 0 or avai_pos_sizes(1) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(0) := avai_pos_sizes(0)-1;
avai_pos_sizes(1) := avai_pos_sizes(1)-1;
end if;
end if;
-- 1 to 4 multicast
elsif sum_dirs = 4 then
if avai_pos_sizes(1) <= 0 or avai_pos_sizes(2) <= 0 or
avai_pos_sizes(3) <= 0 or avai_pos_sizes(4) <= 0 then
if avai_pos_sizes(0) <= 0 or avai_pos_sizes(1) <= 0 or
avai_pos_sizes(2) <= 0 or avai_pos_sizes(3) <= 0 then
ps_dirs(i) <= (others => '0');
else
ps_dirs(i) <= dirs(i);
avai_pos_sizes(0) := avai_pos_sizes(0)-1;
avai_pos_sizes(1) := avai_pos_sizes(1)-1;
avai_pos_sizes(2) := avai_pos_sizes(2)-1;
avai_pos_sizes(3) := avai_pos_sizes(3)-1;
end if;
else
ps_dirs(i) <= (others => '0');

View file

@ -142,7 +142,7 @@ begin
end loop;
end process;
packet_sm_out_gen: process(packet_states, rcv_buff_out, arb_complete)
packet_sm_out_gen: process(packet_states, rcv_buff_out, arb_complete, rd_data)
begin
for i in 0 to TOT_NUM_PATHS-1 loop
case packet_states(i) is

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,11 @@
# is external? | path | data
0 272 0001000000000001110111100100010000000000000000000000000000000001 # origin: (11111-01011) --> dest: (01110-11110,00110-01110)
0 863 0001000000000010100010111100111111000000000000000000000000000001 # origin: (01100-00000) --> dest: (10100-01011,00101-00000,10101-00001,11101-10111)
0 346 0001000000000010000011000100010001000000000000000000000000000001 # origin: (11100-00011) --> dest: (10000-01100,11000-11101)
0 14 0001000000000011001011101010001001000000000000000000000000000001 # origin: (11100-11101) --> dest: (11001-01110,01101-00111)
0 459 0001000000000001100110101111111111000000000000000000000000000001 # origin: (10100-00110) --> dest: (01100-11010,01011-00010,01110-10100,11001-00001,01110-00100,00111-10001)
0 968 0001000000000001101110010000000000000000000000000000000000000001 # origin: (00101-00111) --> dest: (01101-11001)
0 535 0001000000000011101011110000000000000000000000000000000000000001 # origin: (01110-11000) --> dest: (11101-01111)
0 933 0001000000000001110010100000000000000000000000000000000000000001 # origin: (00011-01100) --> dest: (01110-01010)
0 665 0001000000000010000000001111111111000000000000000000000000000001 # origin: (00101-11010) --> dest: (10000-00000,01000-11100,10000-11000,10110-10110,10001-11011,10010-00110)
0 60 0001000000000000001000001111111111000000000000000000000000000001 # origin: (11001-11001) --> dest: (00001-00000,10111-00011,01110-01111,10000-11101)
0 798 0001000000000010110110111011111111000000000000000000000000000001 # origin: (01100-01001) --> dest: (10110-11011,10001-11110,00011-00101,10101-01110)
0 100 0001000000000011100101100000000000000000000000000000000000000001 # origin: (11011-10101) --> dest: (11100-10110)

File diff suppressed because it is too large Load diff

View file

@ -37,6 +37,8 @@ architecture bench of noc_tb is
signal pe_rcv_acks : std_logic_vector(4**level-1 downto 0);
signal pe_send_reqs : std_logic_vector(4**level-1 downto 0);
signal c_send_ack_nxt : std_logic_vector(4*num_paths_ext-1 downto 0);
signal pe_send_ack_nxt : std_logic_vector(4**level-1 downto 0);
signal c_send_reqs_prev : std_logic_vector(4*num_paths_ext-1 downto 0);
signal pe_send_reqs_prev : std_logic_vector(4**level-1 downto 0);
@ -106,10 +108,8 @@ begin
arstN <= '0';
data_chip_in <= (others => (others => '0'));
c_rcv_reqs <= (others => '0');
c_send_ack <= (others => '0');
pe_data_in <= (others => (others => '0'));
pe_rcv_reqs <= (others => '0');
pe_send_ack <= (others => '0');
wait until rising_edge(clk);
arstN <= '1';
wait until rising_edge(clk);
@ -152,7 +152,7 @@ begin
save_results: process(c_send_reqs, pe_send_reqs,
c_send_reqs_prev, pe_send_reqs_prev,
data_chip_out, pe_data_out)
data_chip_out, pe_data_out, pe_send_ack, c_send_ack)
variable istwert : WORD;
variable istpath : integer;
begin
@ -163,27 +163,46 @@ begin
istwert := data_chip_out(i);
istpath := i;
log_test_result(i, istwert, '1', istpath);
c_send_ack(i) <= not c_send_ack(i);
c_send_ack_nxt(i) <= not c_send_ack(i);
else
c_send_ack_nxt(i) <= c_send_ack(i);
end if;
end loop;
elsif pe_send_reqs'event or pe_send_reqs_prev'event then
else
for i in 0 to num_paths_ext*4-1 loop
c_send_ack_nxt(i) <= c_send_ack(i);
end loop;
end if;
if pe_send_reqs'event or pe_send_reqs_prev'event then
for i in 0 to 4**level-1 loop
if (pe_send_reqs(i) = '0' and pe_send_reqs_prev(i) = '1') or
(pe_send_reqs(i) = '1' and pe_send_reqs_prev(i) = '0') then
istwert := pe_data_out(i);
istpath := i;
log_test_result(i, istwert, '0', istpath);
pe_send_ack(i) <= not pe_send_ack(i);
pe_send_ack_nxt(i) <= not pe_send_ack(i);
else
pe_send_ack_nxt(i) <= pe_send_ack(i);
end if;
end loop;
else
for i in 0 to 4**level-1 loop
pe_send_ack_nxt(i) <= pe_send_ack(i);
end loop;
end if;
end process;
update_signals: process(clk)
update_signals: process(clk, arstN)
begin
if rising_edge(clk) then
if arstN = '0' then
c_send_ack <= (others => '0');
pe_send_ack <= (others => '0');
elsif rising_edge(clk) then
c_send_reqs_prev <= c_send_reqs;
pe_send_reqs_prev <= pe_send_reqs;
c_send_ack <= c_send_ack_nxt;
pe_send_ack <= pe_send_ack_nxt;
end if;
end process;
end;

View file

@ -5,17 +5,15 @@ from utils import *
#sender_paths = [["01100","00000"]] # x,y
#recv_paths = [["00010","01110","11110","10011","10011","00000",
# "01101","01001","11011","11011","10101","01100"]]
sender_paths, recv_paths = generate_random_send_recv_paths(2)
sender_paths, recv_paths = generate_random_send_recv_paths(10)
test_name = "random_pe_to_pe_test"
print(sender_paths)
print(recv_paths)
# constants
stimuli = "# is external? | path | data\n"
reference = ""
data_packet = 1
for p, path in enumerate(sender_paths):
data_packet = 1
if len(path) == 2:
index_path = get_index_path(path[0], path[1])
stimuli += "0 " + str(index_path) + " "
@ -28,7 +26,6 @@ for p, path in enumerate(sender_paths):
else:
data_packet, stimuli, reference = gen_ref_for_mult_dir_multicast(
path, recv_paths[p], data_packet, stimuli, reference)
print(len(reference))
data_packet += 1
with open("stimuli.txt", "w") as f:

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,11 @@
# is external? | path | data
0 272 0001000000000001110111100100010000000000000000000000000000000001 # origin: (11111-01011) --> dest: (01110-11110,00110-01110)
0 863 0001000000000010100010111100111111000000000000000000000000000001 # origin: (01100-00000) --> dest: (10100-01011,00101-00000,10101-00001,11101-10111)
0 346 0001000000000010000011000100010001000000000000000000000000000001 # origin: (11100-00011) --> dest: (10000-01100,11000-11101)
0 14 0001000000000011001011101010001001000000000000000000000000000001 # origin: (11100-11101) --> dest: (11001-01110,01101-00111)
0 459 0001000000000001100110101111111111000000000000000000000000000001 # origin: (10100-00110) --> dest: (01100-11010,01011-00010,01110-10100,11001-00001,01110-00100,00111-10001)
0 968 0001000000000001101110010000000000000000000000000000000000000001 # origin: (00101-00111) --> dest: (01101-11001)
0 535 0001000000000011101011110000000000000000000000000000000000000001 # origin: (01110-11000) --> dest: (11101-01111)
0 933 0001000000000001110010100000000000000000000000000000000000000001 # origin: (00011-01100) --> dest: (01110-01010)
0 665 0001000000000010000000001111111111000000000000000000000000000001 # origin: (00101-11010) --> dest: (10000-00000,01000-11100,10000-11000,10110-10110,10001-11011,10010-00110)
0 60 0001000000000000001000001111111111000000000000000000000000000001 # origin: (11001-11001) --> dest: (00001-00000,10111-00011,01110-01111,10000-11101)
0 798 0001000000000010110110111011111111000000000000000000000000000001 # origin: (01100-01001) --> dest: (10110-11011,10001-11110,00011-00101,10101-01110)
0 100 0001000000000011100101100000000000000000000000000000000000000001 # origin: (11011-10101) --> dest: (11100-10110)

View file

@ -54,8 +54,6 @@ def get_multicast_reference(copy_x, copy_y, recv_path, packet):
else 0
y_poss_ind = y_poss_ind+1 if y_poss_ind+1 < len(y_poss_paths[i]) \
else 0
print(copy_x)
print(copy_y)
reference = ""
for x_path, y_path in zip(x_paths, y_paths):
index_path = get_index_path(x_path, y_path)

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -19,12 +19,19 @@ with open("simulation.log", "r") as f:
for line in f:
results.append(line)
all_test_passed = True
test_logs = []
for result in results:
if result in reference:
test_logs.append(result + "---> passed!")
for ref in reference:
if ref in results:
test_logs.append(ref[:-1] + " ---> passed!")
else:
test_logs.append(result + "---> failed!")
all_test_passed = False
test_logs.append(ref[:-1] + " ---> failed!")
if all_test_passed:
test_logs.append("All tests passed successfully :)")
else:
test_logs.append("One or more test failed :(")
with open("test.log", "w") as f:
for test_log in test_logs: