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

Исходные данные:

Quartus 7.2 build 151 SJ Full Version

Проект небольшой, под MAX-II, пытаюсь сделать его на SystemVerilog.

 

Стандартная ситуация, надо задать ширину шины. Вместо самописной функции Log2:

    function    [31:0]    Log2;
        input        [31:0]    Din;
        begin
            for( Log2=0; Din>0; Log2=Log2+1 )    Din = Din>>1;
        end
    endfunction

раскопал замечательную штуку $bits(). Квартус её проглотил с удовольствием, вот только почему-то вместо прежних 102 LE, проект пожирнел до 134 LE. А ведь речь про ширину шины всего-то 9 бит:

localparam WDTH = $bits(430);

 

Собсно вопрос простой, у кого стоИт Квартус посвежее, проверьте, плз, распухает ли у вас проект при такой замене.

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


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

Исходные данные:

Quartus 7.2 build 151 SJ Full Version

Проект небольшой, под MAX-II, пытаюсь сделать его на SystemVerilog.

 

Стандартная ситуация, надо задать ширину шины. Вместо самописной функции Log2:

    function    [31:0]    Log2;
        input        [31:0]    Din;
        begin
            for( Log2=0; Din>0; Log2=Log2+1 )    Din = Din>>1;
        end
    endfunction

раскопал замечательную штуку $bits(). Квартус её проглотил с удовольствием, вот только почему-то вместо прежних 102 LE, проект пожирнел до 134 LE. А ведь речь про ширину шины всего-то 9 бит:

localparam WDTH = $bits(430);

 

Собсно вопрос простой, у кого стоИт Квартус посвежее, проверьте, плз, распухает ли у вас проект при такой замене.

 

 

а ничего что

 

module tb;

    function    [31:0]    Log2;
        input        [31:0]    Din;
        begin
            for( Log2=0; Din>0; Log2=Log2+1 )    Din = Din>>1;
        end
    endfunction

  initial begin : ini
    $display("res = %0d ", $bits(430));
    $display("res = %0d ",Log2(430));
  end

endmodule

 

дает результат

 

# res = 32

# res = 9

 

 

:)))

 

да и где вы увидели упоминание о логарифме ?

 

The $bits system function returns the number of bits required to hold an expression as a bit stream.

...

The $bits function can be used as an elaboration time constant when used on fixed-size data types; hence,

it can be used in the declaration of other data types, variables, or nets.

 

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

 

Удачи !!!

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


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

Исходные данные:

Quartus 7.2 build 151 SJ Full Version

Проект небольшой, под MAX-II, пытаюсь сделать его на SystemVerilog.

 

Стандартная ситуация, надо задать ширину шины. Вместо самописной функции Log2:

    function    [31:0]    Log2;
        input        [31:0]    Din;
        begin
            for( Log2=0; Din>0; Log2=Log2+1 )    Din = Din>>1;
        end
    endfunction

раскопал замечательную штуку $bits(). Квартус её проглотил с удовольствием, вот только почему-то вместо прежних 102 LE, проект пожирнел до 134 LE. А ведь речь про ширину шины всего-то 9 бит:

localparam WDTH = $bits(430);

 

Собсно вопрос простой, у кого стоИт Квартус посвежее, проверьте, плз, распухает ли у вас проект при такой замене.

 

 

Ваша самописная функция отличается от рекомендованной в стандарте. Впрочем как и у меня.

 

function integer clogb2 (input [31:0] value);

if (value < 2) clogb2 = 1;

else begin

value = value - 1;

for (clogb2 = 0; value > 0; clogb2 = clogb2 + 1)

value = value >> 1;

end

endfunction

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


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

Вопрос про Quartus и SystemVerilog, поэтому пишу тут.

Осваивая интерфейсы и modport в SV, упёрся в проблему:

//-?---- Тестовый интерфейс ------------------------------------------------------------------------
interface test_if;
  input                        clk,
  test_if                      i,
  test_if                      o);
endinterface
//##########################################################

//-?---- Тестовый головной модуль ------------------------------------------------------------------
module interfTest (
  input              clk,
  test_if            i,
  test_if            o);
test_if buf_i(), buf_o();
assign buf_i.d = i.d;
always_ff @ (posedge clk) begin
  buf_o.d = buf_i.d;
end
assign o.d = buf_o.d;
endmodule
//###########################################################

Не компилируется, выдавая множественные ошибки "более одного источника сигнала для сети":

 (Error: Net "buf_o.d~0", which fans out to "o.d~0", cannot be assigned more than one value
    Error: Net is fed by "comb~2"
    Error: Net is fed by "test_if:buf_o|test_if.d"
    Error: Net is fed by "test_if:buf_o|test_if.out.d")

Видимо, я не понимаю чего-то важного в идеологии использования интерфейсов и modport'ов (перечитывать черновик стандарта пробовал, пустите в Свои - изучу и окончательный 1800-2005 :) ).

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

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


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

Не скажу про квартус+системверилог, но в

IEEE Std 1364™-2005

IEEE Standard for Verilog® Hardware Description Language

17.11.1 Integer math functions

описана функция $clog2().

Может, квартус уже ее понимает.

 

Успехов

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


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

описана функция $clog2().

Может, квартус уже ее понимает.

Проверил: синтез в 7.2 - ещё нет. И, кстати, в качестве номера поддерживаемого стандарта там указан 1800-2005, а не 1364-2005.

 

А по поводу приведённого примера с интерфейсами, всё же, может кто-то что-то высказать?

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

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


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

Проверил: синтез в 7.2 - ещё нет. И, кстати, в качестве номера поддерживаемого стандарта там указан 1800-2005, а не 1364-2005.

 

А по поводу приведённого примера с интерфейсами, всё же, может кто-то что-то высказать?

вот, надеюсь, хороший простой пример как юзать интерфейсы :)

interface chain_if(input clk);
  logic[31:0] i,  o;
endinterface

module incr(chain_if    ip);
always@(posedge ip.clk)
begin
  ip.o <= ip.i+1;
end
endmodule

module decr(chain_if    ip);
always@ (posedge ip.clk)
begin
  ip.o <= ip.i-1;
end
endmodule

module inver(chain_if    ip);
always @ (posedge ip.clk)
begin
  ip.o <= ~ip.i;
end
endmodule


module test_if (
  input              clk,
  input[31:0]           i,
  output[31:0]           o);
  
chain_if buf1(clk), buf2(clk),buf3(clk);

assign buf1.i = i;
assign buf2.i = buf1.o;
assign buf3.i = buf2.o;
assign o = buf3.o;

incr    incr(buf1);
inver    inver(buf2);
decr    decr(buf3);
endmodule

чуть по другому

interface chain_if  #(parameter chain_depth=3)(input clk);
  logic[31:0] chain[chain_depth:0];
endinterface

module incr(chain_if    ip);
parameter ch=0;
always@(posedge ip.clk)
begin
  ip.chain[ch+1] <= ip.chain[ch]+1;
end
endmodule

module decr(chain_if    ip);
parameter ch=0;
always@ (posedge ip.clk)
begin
  ip.chain[ch+1] <= ip.chain[ch]-1;
end
endmodule

module inver(chain_if    ip);
parameter ch=0;
always @ (posedge ip.clk)
begin
  ip.chain[ch+1] <= ~ip.chain[ch];
end
endmodule


module test_if (
  input              clk,
  input[31:0]           i,
  output[31:0]           o);

parameter depth=3;
  
chain_if #(.chain_depth(depth))chainif(clk);

assign chainif.chain[0] = i;
assign o = chainif.chain[depth];

incr    incr(chainif); defparam incr.ch=0;
inver    inver(chainif);defparam inver.ch=1;
decr    decr(chainif);defparam decr.ch=2;
endmodule

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

generated interface и modport expressions.

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


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

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

Спасибо.

Правда не совсем понятно, какой тогда вообще смысл в $bits(). Т.е. по сути, это что, sizeof(), что ли? Но ведь, ЕМНИМС, в SV и так есть sizeof().

 

Ваша самописная функция отличается от рекомендованной в стандарте.

Точно, я вспомнил. Просто пока мне её хватает. Надеюсь, что скоро она мне вообще не понадобится, раз есть штатная системная функция. :)

 

 

 

 

Ещё вопрос. Попытался воспользоваться union, снова облом. :( Мой Квартус 7.2 не поддерживает. В свежих тоже пока нет?

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


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

В своё время из-за неполной поддержки верилога квартусом пришлось синтезировать в синплифай а потом трассировать в квартусе. Видимо атавизм не искоренен и сегодня.

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


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

Правда не совсем понятно, какой тогда вообще смысл в $bits(). Т.е. по сути, это что, sizeof(), что ли? Но ведь, ЕМНИМС, в SV и так есть sizeof().

 

 

module tb;

  struct packed{
    int a;
    bit b;
  } variable[2];

  initial begin : main
    $display($bits(variable));
    $display($size(variable));
  end

endmodule

 

попробуйте и поймете разницу. это принципиально разные функции. на вопрос а почему работает подсказка : векторов в SV нет, есть упакованные массивы.

 

Надеюсь, что скоро она мне вообще не понадобится, раз есть штатная системная функция. :)

 

самое что интересное упоминаний о $clogb2 нет в accelera SV 3.1a, ieee1800-2005, ieee1800-2007

 

Ещё вопрос. Попытался воспользоваться union, снова облом. :( Мой Квартус 7.2 не поддерживает. В свежих тоже пока нет?

 

читайте хелп : Quartus II Support for SystemVerilog 2005. Там написано что поддерживается.

 

ИМХО Для синтеза вам будет достаточно упакованных структур.

 

В своё время из-за неполной поддержки верилога квартусом пришлось синтезировать в синплифай а потом трассировать в квартусе. Видимо атавизм не искоренен и сегодня.

 

ква давно уже обошел симплифай по поддержке SV, в некоторых случаях он его понимает даже лучше чем прецижен.

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


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

попробуйте и поймете разницу. это принципиально разные функции. на вопрос а почему работает подсказка : векторов в SV нет, есть упакованные массивы.

Ок, спасибо. Перевариваю.

 

самое что интересное упоминаний о $clogb2 нет в accelera SV 3.1a, ieee1800-2005, ieee1800-2007

А может в SV есть эквивалентная функция, просто под другим именем? Раз уж в V2001 была...

 

читайте хелп : Quartus II Support for SystemVerilog 2005. Там написано что поддерживается.

    typedef    union
    {
        logic                a;
    } TEST_UNION_T;

Error (10835): SystemVerilog error at test.sv(59): no support for unions

 

ИМХО Для синтеза вам будет достаточно упакованных структур.

Пока так и поступил. Даже ещё проще. Сейчас мне достаточно даже не структур, а массива регистров. Просто в данном случае, был уместен union, вот и захотелось задействовать то, ради чего на SV пытаюсь заползти. Т.е. пощупать руками его возможности, пообвыкнуться.

 

ква давно уже обошел симплифай по поддержке SV, в некоторых случаях он его понимает даже лучше чем прецижен.

Дело за малым, перенести это "понимание" в практическую плоскость. Ради чего и замутил эту ветку. :)

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


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

А может в SV есть эквивалентная функция, просто под другим именем? Раз уж в V2001 была...

 

Насколько я знаю нет, разделе 22. System tasks and system functions всех указанных выше документов, никакого упоминания об этом нет.

 

порылся в сети нашел IEEE P1364-2005/D3 Draft Standard for Verilog® Hardware Description Language там раздела 17.11 нет вообще и упоминания о $clogb2 тоже.

 

может быть кто выложит IEEE1364-2005

 

Error (10835): SystemVerilog error at test.sv(59): no support for unions

 

фразу читать как "читайте хелп : Quartus II Support for SystemVerilog 2005. Там написано что из SV поддерживается." в частности Section 4—Data Types: no unions. Что и не удивительно.

 

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

 

язык, как язык. со своими плюсами и минусами. Тем о синтезе конструкций СВ на этом форуме много, пользуйтесь поиском.

 

Удачи.

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


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

понятное дело, что само по себе наличие clog2 погоды не делает. гораздо более привлекательна, на мой взгляд, поддержка real, как промежуточного типа в процессе синтеза. производители синтезаторов пока не чешутся. Либо наличие методики использования функций из пакетов vhdl в sv. пока перспективы унылы и поощряются маразматические связки типа scripting language+verilog.

IEEE_Std_1364_2005.pdf

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


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

Это я "тормоз" или Квартус не умеет передавать параметры в interface?

interface DUMMY_IF #( parameter DATA_MAX=5 ) ( input Clk, NRst );
  logic  Data [DATA_MAX-1:0];  //packed
  //logic  Data [0:DATA_MAX-1];  //unpacked
endinterface

 

module Top()
...
DUMMY_IF #(  .DATA_MAX( 10 )  ) DummyIF ( .Clk( Clk ), .NRst( TBaseEn ) );
...
endmodule

При попытке обратиться к DummyIF.Data[n], для n>4 получаю ошибку, дескать, индекс "за гранью разумного". Или всё же какой-то мой "косяк"?

 

 

И ещё. До конца не уверен, но по-моему, синтез Квартуса "падал", когда попытался в интерфейсе задействовать структуру. Во всяком случае, когда всё максимально упростил - выкинул структуру - падения прекратились. Поделитесь, если кто успешно использовал struct в interface. Вполне возможно, что дело в чём-то побочном.

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


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

Это я "тормоз" или Квартус не умеет передавать параметры в interface?

interface DUMMY_IF #( parameter DATA_MAX=5 ) ( input Clk, NRst );
  logic  Data [DATA_MAX-1:0];  //packed
  //logic  Data [0:DATA_MAX-1];  //unpacked
endinterface

 

module Top()
...
DUMMY_IF #(  .DATA_MAX( 10 )  ) DummyIF ( .Clk( Clk ), .NRst( TBaseEn ) );
...
endmodule

При попытке обратиться к DummyIF.Data[n], для n>4 получаю ошибку, дескать, индекс "за гранью разумного". Или всё же какой-то мой "косяк"?

И ещё. До конца не уверен, но по-моему, синтез Квартуса "падал", когда попытался в интерфейсе задействовать структуру. Во всяком случае, когда всё максимально упростил - выкинул структуру - падения прекратились. Поделитесь, если кто успешно использовал struct в interface. Вполне возможно, что дело в чём-то побочном.

8.0 sp1 отлично компилирует вот такое

typedef struct
{
    bit[31:0] register;
    bit zero;
}reg_struct;

interface chain_if  #(parameter chain_depth=3)(input clk);
  reg_struct    chain[chain_depth:0];
endinterface

module incr(chain_if    ip);
parameter ch=0;
always@(posedge ip.clk)
begin
  ip.chain[ch+1].register <= ip.chain[ch].register+1;
  ip.chain[ch].zero<= (ip.chain[ch].register==0)?1:0;
end
endmodule

module decr(chain_if    ip);
parameter ch=0;
always@ (posedge ip.clk)
begin
  ip.chain[ch+1].register <= ip.chain[ch].register-1;
  ip.chain[ch].zero<= (ip.chain[ch].register==0)?1:0;
end
endmodule

module inver(chain_if    ip);
parameter ch=0;
always @ (posedge ip.clk)
begin
  ip.chain[ch+1].register <= ~ip.chain[ch].register;
  ip.chain[ch].zero<= (ip.chain[ch].register==0)?1:0;
end
endmodule


module test_gen_if (
  input              clk,
  input[31:0]           i,
  output[31:0]           o,
  output [31:0]        zeros
  );

parameter depth=10;
  
chain_if #(.chain_depth(depth))chainif(clk);

assign chainif.chain[0].register = i;
assign o = chainif.chain[depth].register;

incr    incr0(chainif); defparam incr0.ch=0;
inver    inver1(chainif);defparam inver1.ch=1;
decr    decr2(chainif);defparam decr2.ch=2;

incr    incr3(chainif); defparam incr3.ch=3;
inver    inver4(chainif);defparam inver4.ch=4;
decr    decr5(chainif);defparam decr5.ch=5;

incr    incr6(chainif); defparam incr6.ch=6;
inver    inver7(chainif);defparam inver7.ch=7;
decr    decr8(chainif);defparam decr8.ch=8;

incr    incr9(chainif); defparam incr9.ch=9;


generate
genvar y;
begin
    for(y=0;y<depth;y=y+1)
    begin:zeros_gen
        assign     zeros[y] = chainif.chain[y].zero;
    end
end
endgenerate
endmodule

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


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

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

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

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

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

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

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

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

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

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