Перейти к содержанию

Junior FPGA Design Engineer: что должен знать?

Доброго всем!

В одной хорошей статье Junior FPGA Design Engineer: как стать? автор приводит довольно много примеров того, что (по его мнению) должен знать и уметь Junior FPGA Design Engineer. Но, как справедливо подмечено в комментариях, "далеко не каждый Junior (и даже Middle) может похвастаться всем тем, что требуется из списка «Необходимо»". К стыду своему следует признаться, что отношусь к одному из таких, хотя имею много лет стажа Verilog RTL-кодирования.

Например, такая задача из тестовых вопросов:
2 Есть ли разница между следующими тремя описаниями? Если да, то в чём она проявляется?
Код
// code 1:
assign a = b + c;

// code 2:
always @( b or c )
  begin
    a = b + c;
  end

// code 3:
always @( * )
  begin
    a = b + c;
  end

ставит меня в тупик.

По-моему мнению, эти описания абсолютно эквивалентны, но, подозреваю, что могу сильно ошибаться.
Был бы признателен за содержательный ответ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
На Ваш вопрос ответит любой синтезатор rolleyes.gif

Warning from admin:
Оверквотинг запрещен правилами форума, п.3.4
Изменено пользователем makc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вопрос: как Вы думаете, что будет происходить при моделировании описанных конструкций в симуляторе? Желательно опишите эти варианты пошагово в контексте модуля, содержащего и другие сигналы/конструкции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Flip-fl0p @ May 8 2018, 13:27) <{POST_SNAPBACK}>
На Ваш вопрос ответит любой синтезатор

А я добавлю. Автор статьи, на которую была ссылка тоже неплохой парень. И можно у него спросить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
с точки синтезатора это одно и то же - я проверил на всякий случай
С точки зрения симуляции то же все одинаково вроде должно быть

единственное различие в том, что в 2х последних случаях выходы должны быть reg

Я бы добавил - это статья - предложение с чего бы начать. Не корректно ее юзать работодателем для отсева неквалифицированных кадров)) Не стоит сильно расстраиваться, если что-то не знаете, как правило если раньше с этим не сталкивались за годы работы в данной сфере, то это вам и не особо нужно(есть конечно исключения)
p.s. это мое личное мнение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Flip-fl0p @ May 8 2018, 11:27) <{POST_SNAPBACK}>
На Ваш вопрос ответит любой синтезатор rolleyes.gif
Синтезатор с собой на собеседование не возьмёшь ))
Но Ваш отсыл справедлив, просто захотелось послушать мнение профессионалов )

Цитата(iosifk @ May 8 2018, 11:45) <{POST_SNAPBACK}>
А я добавлю. Автор статьи, на которую была ссылка тоже неплохой парень. И можно у него спросить...
Здесь все - неплохие парни. Поэтому, решил, что будет лучше спросить у всех.
Но и Ваш совет тоже учту на будущее (есть в статье ещё непонятные вопросы).


Цитата(Lutovid @ May 8 2018, 14:22) <{POST_SNAPBACK}>
с точки синтезатора это одно и то же - я проверил на всякий случай
Да, тоже проверил. Синтезатор Quartusa даёт такой RTL вид:


Цитата(Lutovid @ May 8 2018, 14:22) <{POST_SNAPBACK}>
С точки зрения симуляции то же все одинаково вроде должно быть
Да, Modelsim
Код
module wires_vs_regs_tb;

reg b, c;
wire a_net;
wire [1:0] a_reg;

wires_vs_regs wires_vs_regs_inst(.a_net(a_net), .a_reg(a_reg), .b(b), .c(c));

initial begin
    #0  b = 0; c = 0;
    #10 b = 1;
    #10 b = 0; c = 1;
    #10 b = 1;
    #10 $finish;
end

initial
    $monitor("At %2t b = %1b, c = %1b -> a_net = %1b, a_reg[1:0] = %2b", $time, b, c, a_net, a_reg);

endmodule // wires_vs_regs_tb
даёт:

# At 0 b = 0, c = 0 -> a_net = 0, a_reg[1:0] = 00
# At 10 b = 1, c = 0 -> a_net = 1, a_reg[1:0] = 11
# At 20 b = 0, c = 1 -> a_net = 1, a_reg[1:0] = 11
# At 30 b = 1, c = 1 -> a_net = 0, a_reg[1:0] = 00

Цитата(Lutovid @ May 8 2018, 14:22) <{POST_SNAPBACK}>
единственное различие в том, что в 2х последних случаях выходы должны быть reg
Снова согласен: Quartus сразу же поправил описание цепей и переменных:

Код
module wires_vs_regs(
    input b, c,
    output a_net,
    output reg [1:0] a_reg
);

// code 1:
assign a_net = b + c;

// code 2:
always @( b or c )
  begin
    a_reg[0] = b + c;
  end

// code 3:
always @( * )
  begin
    a_reg[1] = b + c;
  end

endmodule // wires_vs_regs


Цитата(Lutovid @ May 8 2018, 14:22) <{POST_SNAPBACK}>
Я бы добавил - это статья - предложение с чего бы начать. Не корректно ее юзать работодателем для отсева неквалифицированных кадров)) Не стоит сильно расстраиваться, если что-то не знаете, как правило если раньше с этим не сталкивались за годы работы в данной сфере, то это вам и не особо нужно(есть конечно исключения)
p.s. это мое личное мнение
Спасибо Вам за поддержку и всем за советы.
На всякий случай приложу архив с проектом: вдруг, кто в будущем с этим же столкнётся? )



Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти