Jump to content
    

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

А вот аналога 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 ?

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

Edited by Leka

Share this post


Link to post
Share on other sites

Немного не в тему ТС, но все-таки.. Просматривал тестовый код для одной 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

 

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

Только я из 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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Edited by Leka

Share this post


Link to post
Share on other sites

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 не только для описания ПЛИС создавался, но в первую очередь для описания любой логики.

Share this post


Link to post
Share on other sites

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

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

 

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

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

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

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

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

Edited by Leka

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...