Вы можете и в сети найти такой модуль, но лучше самому добавить. Там простые команды. Когда-то в этом расширении были сложные команды, но в окончательной редакции их повыбрасывали. Обратите внимание на деление В расширения на группы. Можете добавлять по частям zba+zbb+zbs и смотреть влияние каждой подгруппы на результат.
В этой версии работает даже векторизация. Я был удивлен , когда увидел, что при выполнении коремарка шевелятся векторные регистры. Прибавка от векторного расширения составила аж 0.006 :)
Провел интересные эксперименты с моделью автора и коремарком. Как уже автор писал, у него показатель см/мгц равен 3.2 при однотактном исполнении всех команд. Вчера я добавил в его модель В-расширение . Получил 3.292 за счет набора zba_zbb_zbs. Сегодня я скачал с сайта Syntacore свежий инструмент с версией компилятора 14.2 . Прежняя версия была 13.2 . На новой версии компилятора показатель 3.3556. Видно, что прогресс у RISC-V не стоит на месте.
Возможно Вы правы. Я так вообще никогда не читал этого автора и в правильных названиях могу ошибаться. Слово "выполнение" мне непонятно. Получается, что если умножение не за 1 такт, то уже многотактовая архитектура? А если выполнение умножения поделено на две части: одна на одной стадии конвейера, а вторая на другой. Это однотактовая? Нужно как-то определиться с правильными названиями, чтобы любой мог понять о чем здесь разговор.
Вы описали конвейерную архитектуру и в ней действительно все команды могут исполняться за один такт. Но от момента начала чтения команды Х , до момента записи результата этой команды в GPR, пройдет несколько тактов. Длина (глубина) конвейера. Сейчас у нас эта длина равна 1. И лично я вижу в такой модели интересность :)
нужно смотреть не умножитель , а критический путь. Он начинается сейчас от регистра РС, далее память, чтение команды, дешифрация команды, чтение операндов из РОН, выполнение операции умножения, запись результата в РОН.
Вы меня развеселили. Очень уж торопитесь. Прочитайте еще раз что я посоветовал. В РС пишется то, что и ранее. А вот наружу выдается pc_result и там защелкивается в буфере синхронной памяти. Так работает память. Для данных вы читаемые данные не получите в текущем такте, только в следующем. И нужен будет дополнительный порт записи в РОНы. Еще нужен будет bypass для загружаемых данных чтобы следующая команда не тормозила, если эти данные нужны ей.
И у Вас будет и синхронная стандартная память, и однотактная модель.
Выражение always_ff @(posedge clk) if(we) mem[addr]<=din; означает, что Вы имеете дело с синхронной памятью, т.к. в выражении присутствует clk. В этом случае вся информация для записи защелкивается по фронту клока в буфере памяти, а сама запись делается в следующем такте. Выражение assign dout= mem[addr]; означает асинхронное чтение памяти. Может ли быть память одновременно синхронной и асинхронной? Вот что по этому поводу мне написал ИИ:
Нет, SRAM не может быть одновременно синхронной и асинхронной. SRAM, или статическая память с произвольным доступом, существует в двух основных типах: асинхронная и синхронная. Асинхронная SRAM не имеет тактового сигнала, а ее операции чтения/записи управляются непосредственно сигналами адреса, данных и управления. Синхронная SRAM, в свою очередь, использует тактовый сигнал для синхронизации операций чтения/записи, что обеспечивает более высокую скорость работы.
можно добавить 2-хпортовую синхронную память. при этом вместо instruction_address = pc; нужно instruction_address = pc_result; Это для чтения команд. Чтение данных будет отложенное и нужно будет сделать bypass. Тогда будет реально синхронная 2-хпортовая SRAM и однотактная модель.
У Вас сейчас, например, для команды LD тактой путь сигнала: РС адрес из регистра в память, чтение памяти, декодирование команды, определение что команда LD, вычисление адреса чтения, отправка адреса в память, чтение памяти, прием и преобразование данных , запись в РОН. И все это ОДИН такт :) "тяжело" (с)
Вы привели пример памяти у которой запись синхронная, а чтение асинхронное. Уже для меня непонятно что :) Синхронная запись означает, что реальная запись будет не до фронта клока, а после него, т.е. в следующем такте. Но в следующем такте у Вас по этому же адресу возможно уже асинхронное чтение.
Далее, оставаясь с однотактной моделью, можно попробовать реализовать fusion для комбинаций команд. Это тоже улучшит коремарк на МГц. Конвейеры только добавят проблем и загубят хорошие показатели :)
С векторным расширением это уже совсем другая модель и она проигрывает по коремаркам модели автора :)
Кстати, автору нужно как-то назвать ядро. А то без имени уже третью часть.
Вы можете и в сети найти такой модуль, но лучше самому добавить. Там простые команды. Когда-то в этом расширении были сложные команды, но в окончательной редакции их повыбрасывали. Обратите внимание на деление В расширения на группы. Можете добавлять по частям zba+zbb+zbs и смотреть влияние каждой подгруппы на результат.
В этой версии работает даже векторизация. Я был удивлен , когда увидел, что при выполнении коремарка шевелятся векторные регистры. Прибавка от векторного расширения составила аж 0.006 :)
Оказывается, там только оглавление и мусор. Ну да ладно. Все равно спасибо :)
Провел интересные эксперименты с моделью автора и коремарком. Как уже автор писал, у него показатель см/мгц равен 3.2 при однотактном исполнении всех команд. Вчера я добавил в его модель В-расширение . Получил 3.292 за счет набора zba_zbb_zbs. Сегодня я скачал с сайта Syntacore свежий инструмент с версией компилятора 14.2 . Прежняя версия была 13.2 . На новой версии компилятора показатель 3.3556. Видно, что прогресс у RISC-V не стоит на месте.
Спасибо. Особенно , что на русском. А то я со своим испанским ни беса, ни муччо
Возможно Вы правы. Я так вообще никогда не читал этого автора и в правильных названиях могу ошибаться. Слово "выполнение" мне непонятно. Получается, что если умножение не за 1 такт, то уже многотактовая архитектура? А если выполнение умножения поделено на две части: одна на одной стадии конвейера, а вторая на другой. Это однотактовая? Нужно как-то определиться с правильными названиями, чтобы любой мог понять о чем здесь разговор.
Вы описали конвейерную архитектуру и в ней действительно все команды могут исполняться за один такт. Но от момента начала чтения команды Х , до момента записи результата этой команды в GPR, пройдет несколько тактов. Длина (глубина) конвейера. Сейчас у нас эта длина равна 1. И лично я вижу в такой модели интересность :)
нужно смотреть не умножитель , а критический путь. Он начинается сейчас от регистра РС, далее память, чтение команды, дешифрация команды, чтение операндов из РОН, выполнение операции умножения, запись результата в РОН.
Вы меня развеселили. Очень уж торопитесь. Прочитайте еще раз что я посоветовал. В РС пишется то, что и ранее. А вот наружу выдается pc_result и там защелкивается в буфере синхронной памяти. Так работает память. Для данных вы читаемые данные не получите в текущем такте, только в следующем. И нужен будет дополнительный порт записи в РОНы. Еще нужен будет bypass для загружаемых данных чтобы следующая команда не тормозила, если эти данные нужны ей.
И у Вас будет и синхронная стандартная память, и однотактная модель.
это фикция, а не частота :)
Да. Поддерживаю :)
Выражение always_ff @(posedge clk) if(we) mem[addr]<=din; означает, что Вы имеете дело с синхронной памятью, т.к. в выражении присутствует clk. В этом случае вся информация для записи защелкивается по фронту клока в буфере памяти, а сама запись делается в следующем такте. Выражение assign dout= mem[addr]; означает асинхронное чтение памяти. Может ли быть память одновременно синхронной и асинхронной? Вот что по этому поводу мне написал ИИ:
можно добавить 2-хпортовую синхронную память. при этом вместо instruction_address = pc; нужно instruction_address = pc_result; Это для чтения команд. Чтение данных будет отложенное и нужно будет сделать bypass. Тогда будет реально синхронная 2-хпортовая SRAM и однотактная модель.
Тактовую увеличит, но сейчас разговор про коремарк на МГц. Мы обгоняем всех по этому показателю :)
У Вас сейчас, например, для команды LD тактой путь сигнала: РС адрес из регистра в память, чтение памяти, декодирование команды, определение что команда LD, вычисление адреса чтения, отправка адреса в память, чтение памяти, прием и преобразование данных , запись в РОН. И все это ОДИН такт :) "тяжело" (с)
И я про синхронную SRAM, Этот тип памяти обычно подключается к ядру (ТСМ память называется) чтобы получить наибольшее число коремарков на МГц :)
Верно! Но сделать однотактовую модель можно.
Вы привели пример памяти у которой запись синхронная, а чтение асинхронное. Уже для меня непонятно что :) Синхронная запись означает, что реальная запись будет не до фронта клока, а после него, т.е. в следующем такте. Но в следующем такте у Вас по этому же адресу возможно уже асинхронное чтение.
Далее, оставаясь с однотактной моделью, можно попробовать реализовать fusion для комбинаций команд. Это тоже улучшит коремарк на МГц. Конвейеры только добавят проблем и загубят хорошие показатели :)