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

VERILOG, тест бенч и не только

Спасибо, ответы очень помогли.

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

Могут дать, а могут и не дать, смотря в какой последовательности напишете операторы.

И кстати process(all) стала только недавно поддерживаться, не все среды такую запись будут поддерживать.

https://forums.xilinx.com/t5/General-Techni...all/td-p/720637

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


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

А вот аналога if rising_edge(clk) в Верилоге нет и не может быть из-за отсутствия концепции сигналов, хранящих состояние, бывшее в предыдущем дельта-цикле.

Имхо, без концепции хранения предыдущих значений в дельта-циклах невозможно реализовать "принцип однократного присваивания", а это вроде основа SV/VHDL.

Порядок операторов неважен, если не нарушается принцип однократного присваивания. Пример. Вычисление:

q = ( a + b ) * c + d;

разобъем на несколько последовательных:

ab = a + b;

abc = ab * c;

abcd = abc + d;

q = abcd;

и перемешаем их:

module top(
    input [3:0]    a,b,c,d,
    output [3:0] q
);
var [3:0] ab,abc,abcd;
always begin
    q = abcd;     
    abcd = abc+d;     
    abc = ab*c;
    ab = a+b;        
end
endmodule

 

library ieee; --use ieee.all;

entity top is port (
    a,b,c,d    : in integer range 0 to 15;
    q    : out integer range 0 to 15
);
end entity;
architecture rtl of top is 
begin
    process(all)
        variable ab,abc,abcd: integer range 0 to 15;    
    begin
        q <= abcd;     
        abcd := abc+d;     
        abc := ab*c;
        ab := a+b;        
    end process;
end;

Синтезируется правильно.

Поленились добавить if rising_edge(clk) в SV ?

Или что-то принципиальное мешает этому ?

Изменено пользователем Leka

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


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

Немного не в тему ТС, но все-таки.. Просматривал тестовый код для одной Spartan-6 платы. Объясните пожалуйста знатоки верилога что есть 3 и 6 строки?

Такое там в коде сплошь и рядом. Прошу если чё сильно не пинать )

 

1. always @ (posedge vga_clk)

2. begin

3. if(1'b0) hsync_r <= 1'b1;

4. else if(x_cnt == 1) hsync_r <= 1'b0;

5. else if(x_cnt == H_SyncPulse) hsync_r <= 1'b1;

6. if(1'b0) hsync_de <= 1'b0;

7. else if(x_cnt == Hde_start) hsync_de <= 1'b1;

8. else if(x_cnt == Hde_end) hsync_de <= 1'b0;

9. end

 

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


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

Это условие всегда ложно. Какая-то заглушка. Возможно, для отладки.

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


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

Доброго дня, коллеги!

Существуют ли способы указать в тесбенче на Verilog формат отображения переменных при моделировании?

Пользуюсь Modelsim Altera Edition, сигналов в проекте много, и каждый раз при моделировании все они отображаются в бинарном формате.

Потом приходится вручную указывать форматы HEX, UNSIGNED, DCIMAL для отдельных сигналов. Хотелось бы сократить эту рутинную операцию.

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


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

Доброго дня, коллеги!

Существуют ли способы указать в тесбенче на Verilog формат отображения переменных при моделировании?

Пользуюсь Modelsim Altera Edition, сигналов в проекте много, и каждый раз при моделировании все они отображаются в бинарном формате.

Потом приходится вручную указывать форматы HEX, UNSIGNED, DCIMAL для отдельных сигналов. Хотелось бы сократить эту рутинную операцию.

Можно сделать так: достали все нужные сигналы, привели к нужному формату и сохраните wave.do. Потом при запуске симуляции вызывайте ваш wave, там все настройки должны остаться, как в момент сохранения.

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


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

Можно сделать так: достали все нужные сигналы, привели к нужному формату и сохраните wave.do. Потом при запуске симуляции вызывайте ваш wave, там все настройки должны остаться, как в момент сохранения.

Верно. Только я из wave.do сразу все копирую в основной скрипт *.do и только его запускаю. Либо в нем же пишу do wave.do... и тогда основной скрипт запускает wave.do...

 

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


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

Только я из wave.do сразу все копирую в основной скрипт *.do и только его запускаю.

А в какое место основного скрипта надо копировать?

Переношу все содержимое wave.do в основной скрипт - не помогает.

Содержимое основного скрипта <имя проекта>.do у меня следующее:

transcript on

if {[file exists rtl_work]} {

vdel -lib rtl_work -all

}

vlib rtl_work

vmap work rtl_work

 

vlog -vlog01compat -work work +incdir+F:/Work/XXXXXXXXXXXXXXXXXXX.v}

vlog -vlog01compat -work work +incdir+F:/Work/XXXXXXXXXXXXXXX.v}

vlog -vlog01compat -work work +incdir+F:/Work/XXXXXXXXXXXXXXXXXXX_tb.v}

 

vsim -t 1ps -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L stratixiv_hssi_ver -L stratixiv_pcie_hip_ver -L stratixiv_ver -L rtl_work -L work -voptargs="+acc" xxxxxxxxxxxxxxxxxxxxxx_tb

 

add wave *

view structure

view signals

run -all

 

Если запускаю wave.do после симуляции, то на экране появляется второй комплект сигналов, но уже в правильном формате, который я задавал до сохранения wave.do

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


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

vsim -t 1ps -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L stratixiv_hssi_ver -L stratixiv_pcie_hip_ver -L stratixiv_ver -L rtl_work -L work -voptargs="+acc" xxxxxxxxxxxxxxxxxxxxxx_tb

 

add wave *

view structure

 

Попробуйте "add wave *" заменить на do wave.do

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


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

module top(oe,din,D1,D2,q1,q2);
input oe,din;
inout D1,D2;
output q1,q2;

always_comb begin
    D1 = oe ? din : 1'bz;
    q1 = D1;
end

always_comb begin
    q2 = D2;
    D2 = oe ? din : 1'bz;
end

endmodule

Квартус 13.1

Из каких таких соображений q1 должен получить при синтезе выход с 3-я состояниями ?

post-9118-1481463034_thumb.png

Изменено пользователем Leka

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


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

module top(oe,din,D1,D2,q1,q2);
input oe,din;
inout D1,D2;
output q1,q2;

always_comb begin
    D1 = oe ? din : 1'bz;
    q1 = D1;
end

always_comb begin
    q2 = D2;
    D2 = oe ? din : 1'bz;
end

endmodule

Квартус 13.1

Из каких таких соображений q1 должен получить при синтезе выход с 3-я состояниями ?

 

порядок команд имеет значение.

в always_comb в том числе.

 

то, что вы его не объявили как inout, не мешает синтезатору внутри этого модуля рассматривать его как выход с 3 состояниями. ибо всё-таки verilog не только для описания ПЛИС создавался, но в первую очередь для описания любой логики.

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


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

порядок команд имеет значение

Имхо. Не должен иметь значение, если _все_ переменные в блоке присваиваются однократно. А если имеет, значит в стандарте логическое противоречие (имхо).

 

Еще более странная ситуация, если inout заменить на output. В этом случае непонятно, почему синтезатор

    D1 = oe ? din : 1'bz;
    q1 = D1;

рассматривает, как

    D1 = oe ? din : 1'bz;
    q1 = oe ? din : 1'bz;

вместо закорачивания "проводом" q1 и D1.

Изменено пользователем Leka

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


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

Надеюсь, такое исключение только для 'z, тк это свойство однократного присваивания(независимость от порядка) очень удобно на практике.

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


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

А если имеет, значит в стандарте логическое противоречие (имхо).
Не люблю верилог, но даже я знаю, что при блокирующем присваивании порядок важен, при неблокирующем нет.

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


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

при блокирующем присваивании порядок важен

Пример, пожалуйста, для варианта с однократным присваиванием всех переменных в блоке. За исключением присваивания 'z.

 

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...