spamsink: (Default)
[personal profile] spamsink


Думаю предлагать это на интервью людям, не знающим языков описания хардвера, но утверждающим, что смогут их быстро выучить.

Дан блок кода, состоящий из 4-х операторов присваивания:

X = A;
X <= B;
X <= X + 1;
X = D;

где "=" - обычное присваивание, а "<=" - "необычное". Известно, что после выполнения этого блока значение X равно A+1. Что можно сказать о семантике "необычного" присваивания?

Date: 2012-01-06 09:20 pm (UTC)
From: [identity profile] yakov-sirotkin.livejournal.com
Обычное присваивание меняет внутреннее состояние X, а необычное - внешнее?

Date: 2012-01-07 05:37 am (UTC)
From: [identity profile] yakov-sirotkin.livejournal.com
Не суть важно, как назвать, очевидно, что у меня не было шансов угадать правильный термин. Главное, что полное состояние X описывается не одним, а двумя значениями.

Date: 2012-01-07 09:35 am (UTC)
From: [identity profile] yakov-sirotkin.livejournal.com
Есть ощущение, что надо довольно долго мозги затачивать, чтобы эта версия стала более очевидной:)

То есть, возвращаясь к началу поста, на интервью пальцы погнуть можно, но совсем быстро - не получиться.

Date: 2012-01-06 09:26 pm (UTC)
From: [identity profile] leonidph1972.livejournal.com
необычное присваивание работает с пайпланом

Date: 2012-01-07 01:48 pm (UTC)
From: [identity profile] leonidph1972.livejournal.com
Выполнение команды размазывается на несколько клоков
то что вы видете как X <= X + 1
реально 2 команды (как минимум)- сделать инкремент и занести результат.
мне сложно тут рисовть таблицу но так это работает

Date: 2012-01-06 09:31 pm (UTC)
From: [identity profile] excubitus.livejournal.com
Лень искать, но есть подозрение, что это какое-то отложенное присваивание, выполняющееся только после выхода из блока. X, небось, связан с каким-нибудь индикатором, который должен красиво мигнуть при переходе от А к А+1.

Date: 2012-01-06 09:36 pm (UTC)
From: [identity profile] iime.livejournal.com
Это было бы нечестно)

Date: 2012-01-06 09:38 pm (UTC)
From: [identity profile] excubitus.livejournal.com
Ну, если бы мне на интервью дали такой тест, я бы поискал непременно. :)

Date: 2012-01-06 09:39 pm (UTC)
From: [identity profile] iime.livejournal.com
Я не про "искать", а про "только после выхода из блока.")

Date: 2012-01-06 09:40 pm (UTC)
From: [identity profile] excubitus.livejournal.com
Что ж в этом нечестного?

Date: 2012-01-06 09:43 pm (UTC)
From: [identity profile] excubitus.livejournal.com
Типа того. Понимаю, что не со всеми прокатит. :)

Date: 2012-01-06 09:39 pm (UTC)
From: [identity profile] excubitus.livejournal.com
Красиво.

Date: 2012-01-06 09:53 pm (UTC)
From: [identity profile] iime.livejournal.com
А 'X = D' выполняется перед выполнением отложенных присваиваний и поэтому на результат не влияет?

Date: 2012-01-06 10:05 pm (UTC)
From: [identity profile] sab123.livejournal.com
1) А что, явно границы такта в Верилоге не указываются?

2) Тогда я не понимаю, как может работать просто "=". "<=" подразумевает регистры, содержащие триггеры (flip-flops) с двухступенчатой синхронизацией. Т.е. если мы пишем

X <= Y
Y <= X

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

3) Все равно непонятно, почему результатом будет A+1, а не какая-то каша и не D.

4) При таком раскладе именно "<=" - обычное присваивание, а "=" - необычное.

Date: 2012-01-06 11:34 pm (UTC)
From: [identity profile] sab123.livejournal.com
2) если "=" и "<=" применяются для разных регистров, то оно понятно, а вот для одного - странно

3) С другой стороны, при таком подходе можно сказать, что tmp_X - это у нас первая ступень двухступенчатого регистра, а собственно X - вторая. И если его синтезировать из индивидуальных элементов, совсем ничто не мешает так делать, и даже экономия выходит на том, что во многих случаях можно обходиться одноступенчатыми регистрами.

Кстати, исходя из чувствительностей, будет ли оно побито на такты вот так?

X = A;
tmp_X = B;
---
tmp_X = X + 1;
X = D;
---
X = tmp_Х;

4) Но ведь получается, что X=X+1 не имеет смысла, а X <= X+1 - имеет, то есть именно <= более привычно для обычных программистов. Или оно само умеет отслеживать циклическую зависимость в X=X+1 и вставлять tmp_X?

Date: 2012-01-07 01:34 am (UTC)
From: [identity profile] master-a.livejournal.com
1. На всякий случай назыаются эти присвоения в Верилоге
"blocking" and "non-blocking". Немало статей и книг посвящено пояснению как это все работает.

2. Как не очень програмист, но ЕЕ занимавшийся вериложеством скажу что считается очень дурным тоном мешать в одном блоке одни присвоения с другими.

3. На уровне RTL следует помнить что кроме двухступенчатых регистров есть еще transparent latches.

Date: 2012-01-07 04:24 am (UTC)
From: [identity profile] sab123.livejournal.com
2) Мне более интересно, как оно выходит в итоге в настоящем железе. Я бы на самом деле заставил компилятор выдавать ошибку на такую заведомо непотребную мешанину в коде. Потому что она скорее всего означает, что кто-то криво сделал cut-n-paste.

3) Но в итоге-то увеличенное значение должно попасть назад в X?

4) Я правильно понимаю, что X до присваивания и X после присваивания X=X+1 будут разными физическими регистрами, а потом переложится назад когда пойдет следующая итерация цикла? Потому что если это сделать в одном одноступенчатом регистре, то выйдет гонка с неопределенным результатом.

Date: 2012-01-07 06:42 am (UTC)
From: [identity profile] master-a.livejournal.com
Имея корни в жестком железе соединяемом проводами, я всегда думаю в терминах получающегося "мягкого" железа а не того что позволяет язык.

Нанятно что верилог придуман для симуляции (равно как и VHDL) а использование для синтеза пришло потом. Так что не удивительно что бывает несинтезируемый код. В отличие от програм, которые всегда выполняемы, даже если результат - core dump.

Date: 2012-01-07 02:04 pm (UTC)
From: [identity profile] sab123.livejournal.com
Ну почему, пронраммы тоже могут содержать семантические ошибки, на которых компилятор остановится.

Date: 2012-01-07 02:09 pm (UTC)
From: [identity profile] sab123.livejournal.com
То есть, когда присваивается глобальная переменная X, не используется каждый раз тот же самый регистр, а на каждое присваивание создается новый? А там где она читается, оно анализирует, из какого кода могло выполнение сюда прийти и использует соответствующий из них?

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

Date: 2012-01-08 02:53 pm (UTC)
From: [identity profile] sab123.livejournal.com
Но тут-то он будет не просто неэффективный, а нерабочий. Если вычисление функции не уложится в цикл, в результате получится мусор.

Date: 2012-01-06 09:35 pm (UTC)
From: [identity profile] msh.livejournal.com
Все операции синхронизированы с клоком и = и <= выполняются в разное время такта?

Date: 2012-01-06 10:31 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
А вот задачка про другой язык программирования, ну скажем Метапост.

X=A;
X:=X+1;
X=D;

После его выполнения А получается на единицу меньше чем D. В чём семантика значков "=" и ":=" ?
Edited Date: 2012-01-06 10:32 pm (UTC)

Date: 2012-01-06 10:48 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
я там поэтому поменял слегка, теперь не удовлетворяет

Date: 2012-01-06 10:49 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
Ну может и годится, но тогда это какой-то другой язык. Уточню ещё --- ":=" это обычное присваивание.

Date: 2012-01-06 11:12 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
"=" это "равно", то есть такой значок задаёт (линейное) уравнение

Date: 2012-01-07 08:46 am (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
Если я правильно понимаю, в том примере всё развалится при попытке присваивания X:=X+1, потому что к тому моменту X ещё не вычислено. Если в самое начало добавить что-нибуть типа X+2A=6 то всё исправится, и оба X и A будут вычислены после второго уравнения (X=A), после чего Х увеличится на единичку и D вычислится в последней строке. Но это всё конечно фигня, присваивание для обычных численных переменных в этом языке просто не нужно, вполне хватает линейных уравнений

Date: 2012-01-07 01:15 am (UTC)
From: [identity profile] ygam.livejournal.com
Еще в языке SISAL можно написать:

X := old Y;
Y := old X

http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=00130079
Edited Date: 2012-01-07 01:16 am (UTC)

Date: 2012-01-07 02:40 am (UTC)
From: [identity profile] ygam.livejournal.com
О! Похоже, у моего работодателя есть подписка!

Date: 2012-01-07 09:58 am (UTC)
From: [identity profile] janatem.livejournal.com
Если этот код валиден, то Verilog воистину странный язык. Я знаю VHDL и осмелюсь утверждать, что достаточно хорошо понимаю принципы описания цифровой аппаратуры.

Даже если предположить, что одно из присваиваний подразумевает onclock, а другое -- просто alias (соединение проводников), всё равно непонянто, почему не будет ошибки типа multisource. Даже если на разных "=>" разные клоки, будет либо явно multisource, либо мусорное значение в результате.

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 5th, 2026 03:54 pm
Powered by Dreamwidth Studios