При переезде проекта с Stratix V на Arria 10 столкнулся с интересной и неприятной вещью в тех местах, где происходит чтение данных из блоков памяти M20K (и на выходе этой памяти не стоит регистр):
тайминг стал хуже и эти пути мешают укладыванию по частоте. Хотя я ожидал обратных результатов: Arria 10 позиционируется как более продвинутый чип, чем Stratix V.
Для демонстрации этой проблемы я сделал минипроект: https://github.com/johan92/s5_a10_ram_test
В его основе лежит SIMPLE DUAL PORT RAM, где с одного порта происходит чтение данных, прибавление каких-то чисел, и записывание данных обратно в память (через другой порт). В обоих проектах стоит clk с периодом в 3 нс.
Собрать проект можно через make в папках s5/a10. В конце cборки сформируется отчет вида s5/a10.clk.paths.rpt, где будут указаны пути, у которых худший тайминг в проекте.
Эти отчеты при сборке можно найти тут (осторожно, много трафика): https://github.com/johan92/s5_a10_ram_test/.../master/reports
Что мы видим (кроме того, что Arria проиграла в тайминге):
начало худшего пути у Arria выглядит так:
Код
6.360; 1.991; RR; uTco; 2 ; EC_X70_Y173_N3 ; ; g_ram_test_engine[0].ram_test_engine|mem|altsyncram_component|...|portbdataout[0]
6.957; 0.597; RR; IC ; 6 ; LABCELL_X71_Y174_N9; High Speed; g_ram_test_engine[0].ram_test_engine|Add1~13|datad
6.957; 0.597; RR; IC ; 6 ; LABCELL_X71_Y174_N9; High Speed; g_ram_test_engine[0].ram_test_engine|Add1~13|datad
А у Stratix так:
Код
4.358; 0.000; ; uTco; 32; M20K_X205_Y2_N0; ; ram_test:g_ram_test_engine[0].ram_test_engine|mem:mem|altsyncram:altsyncram_component|...|ram_block1a0~PORT_B_WRITE_ENABLE_REG
4.423; 0.065; RF; CELL; 2 ; M20K_X205_Y2_N0; High Speed; g_ram_test_engine[0].ram_test_engine|mem|altsyncram_component|...|portbdataout[3]
4.885; 0.462; FF; IC ; 4 ; LABCELL_X204_Y2_N9; High Speed; g_ram_test_engine[0].ram_test_engine|Add1~13|dataa
4.423; 0.065; RF; CELL; 2 ; M20K_X205_Y2_N0; High Speed; g_ram_test_engine[0].ram_test_engine|mem|altsyncram_component|...|portbdataout[3]
4.885; 0.462; FF; IC ; 4 ; LABCELL_X204_Y2_N9; High Speed; g_ram_test_engine[0].ram_test_engine|Add1~13|dataa
Две наносекунды (1.991) на чтении из памяти на мой взгляд это очень странно (по сравнению с тем, что у Stratix).
Каких-то изменений в структуре блоков памяти я не нашел между Statrix V и Arria 10 в даташитах (которые бы объяснили, что здесь происходит), поэтому я и решил создать этот топик.
Встречали ли вы что-то похожее в своих проектах под Arria 10? Может быть я что-то делаю не так?
Заранее спасибо за идеи и предложения

Quartus:
Код
Version 16.0.2 Build 222 07/20/2016 SJ Standard Edition
P.S.
Ставить триггер на выходе памяти - это хорошая идея, но меня здесь интересует физика вопроса и маркетинг, который говорит, что Ария во всём лучше Стратикса
