Задать вопрос
@EvgenySbl

Как правильно разрабатывать код на Verilog, с прицелом на производство процессора?

Добрый день!
Каким должен быть код, если хочется спроектировать процессор, для производства в виде отдельного кристалла?
1. Делать ли код синхронным или асинхронным?

В FPGA, принято писать синхронный код, поскольку это приводит к детерминированному результату. В простейшем случае, возьмем триггер. С точки зрения программирования FPGA, вероятно правильнее написать что-то вроде:

always @(posedge i_clk) begin
if (i_wr) begin
r_data <= i_data;
end else begin
r_data <= r_data;
end
end
Таким образом мы получаем регистр, по входу которого с логической точки зрения стоит мультиплексор управляемый по сигналу i_wr. Когда пишется код для FPGA,- это приемлемо.
Почему? Потому что FPGA все-равно будет использовать логические блоки LUT, с прогружемой в них таблицей истинности и триггер по выходу. Синхронность по клоковому входу, позволяет получить предсказуемый результат. С другой стороны, это вроде бы избыточно для процессора, поскольку примитива в виде D-триггера выглядет более интересной.
always @( i_wr, i_data )
if ( i_wr ) begin
r_data <= i_data;
end
end
На выходе, по идее, получаем обычный D-триггер, и избавляемся от мультиплексора по входу. Для FPGA, подобный подход приведет к несовсем корректному подходу, поскольку появится асинхронность, которая требует дополнительного моделирования. Но, с точки зрегия реализации в микросхеме, тайминги работы триггера являются чем-то детерминированным. Так как правильно делать?

2. У меня возникла идея сделать отдельный стек и шины для каждого из регистров процессора, подключив к ним быструю память. Имеет ли право подобная идея на существование? Приведет ли подобный подход к каким-либо проблемам с аппаратной реализацией?

Попробую пояснить. При функциональном программировании, как правило, очень часто используется такая структура, как стек. В стек, при вызове функции, помещаются регистры, которые будут использоваться внутри вызываемой функции для того, чтобы не повредить изначальные значения, после возврата. Если стек сделать аппаратным для каждого регистра в отдельности, это должно позволить вызывать функции не используя сохранение данных в основную оперативную память. Да, имеется вопрос по глубине стека, но в микроконтроллерах подобный стек редко бывает большим. Отдельная шина, по логике вещей, должна позволить осществить вызов функции или переход в обработчик прерываения за один такт. Кроме того, стеки всех регистров, могут иметь общий указатель (регистр), изменение которого с последующим возвратом из "функции", позволяет произвести переключение задач. Т.е. в общем и целом, я хочу сразу сохранить весь контест работы процессора в отдельный стек. Или скорее параллельные стеки с общим указателем. Это реализуемо?

3. В FPGA, например GoWin, имеются готовые блоки синхронной памяти. Эта память имеет четыре шины. Шина адреса, шина управления (clk, wr), две шины данных. Одна для данных по входу, другая по выходу. Т.е. в FPGA, идею со стеком для каждого регистра, удобно реализовать используя эту память BSRAM, в моем случае.
Однако, в том случае, когда проектируется процессор, полагаю, возникает в том числе вопрос соединений между готовыми модулями. Т.е. в CPU удобно использовать готовый IP-блок памяти. Где можно получить информацию по подобным IP-блокам. Меня интересует, например, в данном случае лучше применять две однонаправленных шины данных или одну двунаправленную, и сигналы RD/WR/OE соотвтетвенно.

Вообще, я разработчик прошивок для микроконтроллеров и разработчик BSP/драйверов в прошлом (VxWorks, Windows), по этому несколько далек от тематики по вопросу. Подскажите пожалуйста, где можно уточнить указанную информацию?
  • Вопрос задан
  • 10 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы