Tahoe 0 8 августа, 2008 Опубликовано 8 августа, 2008 · Жалоба Исходные данные: 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); Собсно вопрос простой, у кого стоИт Квартус посвежее, проверьте, плз, распухает ли у вас проект при такой замене. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 августа, 2008 Опубликовано 8 августа, 2008 · Жалоба Исходные данные: 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. как я понимаю речь идет о битовой длине выражения, а не о битовой длине достаточной для величины. Удачи !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 8 августа, 2008 Опубликовано 8 августа, 2008 · Жалоба Исходные данные: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intekus 0 9 августа, 2008 Опубликовано 9 августа, 2008 (изменено) · Жалоба Вопрос про 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 :) ). Изменено 9 августа, 2008 пользователем Intekus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 9 августа, 2008 Опубликовано 9 августа, 2008 · Жалоба Не скажу про квартус+системверилог, но в IEEE Std 1364™-2005 IEEE Standard for Verilog® Hardware Description Language 17.11.1 Integer math functions описана функция $clog2(). Может, квартус уже ее понимает. Успехов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intekus 0 10 августа, 2008 Опубликовано 10 августа, 2008 (изменено) · Жалоба описана функция $clog2(). Может, квартус уже ее понимает. Проверил: синтез в 7.2 - ещё нет. И, кстати, в качестве номера поддерживаемого стандарта там указан 1800-2005, а не 1364-2005. А по поводу приведённого примера с интерфейсами, всё же, может кто-то что-то высказать? Изменено 10 августа, 2008 пользователем Intekus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 11 августа, 2008 Опубликовано 11 августа, 2008 · Жалоба Проверил: синтез в 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 11 августа, 2008 Опубликовано 11 августа, 2008 · Жалоба как я понимаю речь идет о битовой длине выражения, а не о битовой длине достаточной для величины. Спасибо. Правда не совсем понятно, какой тогда вообще смысл в $bits(). Т.е. по сути, это что, sizeof(), что ли? Но ведь, ЕМНИМС, в SV и так есть sizeof(). Ваша самописная функция отличается от рекомендованной в стандарте. Точно, я вспомнил. Просто пока мне её хватает. Надеюсь, что скоро она мне вообще не понадобится, раз есть штатная системная функция. :) Ещё вопрос. Попытался воспользоваться union, снова облом. :( Мой Квартус 7.2 не поддерживает. В свежих тоже пока нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mov 3 11 августа, 2008 Опубликовано 11 августа, 2008 · Жалоба В своё время из-за неполной поддержки верилога квартусом пришлось синтезировать в синплифай а потом трассировать в квартусе. Видимо атавизм не искоренен и сегодня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 11 августа, 2008 Опубликовано 11 августа, 2008 · Жалоба Правда не совсем понятно, какой тогда вообще смысл в $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, в некоторых случаях он его понимает даже лучше чем прецижен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 12 августа, 2008 Опубликовано 12 августа, 2008 · Жалоба попробуйте и поймете разницу. это принципиально разные функции. на вопрос а почему работает подсказка : векторов в 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, в некоторых случаях он его понимает даже лучше чем прецижен. Дело за малым, перенести это "понимание" в практическую плоскость. Ради чего и замутил эту ветку. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 августа, 2008 Опубликовано 12 августа, 2008 · Жалоба А может в 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 пытаюсь заползти. Т.е. пощупать руками его возможности, пообвыкнуться. Дело за малым, перенести это "понимание" в практическую плоскость. язык, как язык. со своими плюсами и минусами. Тем о синтезе конструкций СВ на этом форуме много, пользуйтесь поиском. Удачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 17 августа, 2008 Опубликовано 17 августа, 2008 · Жалоба понятное дело, что само по себе наличие clog2 погоды не делает. гораздо более привлекательна, на мой взгляд, поддержка real, как промежуточного типа в процессе синтеза. производители синтезаторов пока не чешутся. Либо наличие методики использования функций из пакетов vhdl в sv. пока перспективы унылы и поощряются маразматические связки типа scripting language+verilog. IEEE_Std_1364_2005.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 9 сентября, 2008 Опубликовано 9 сентября, 2008 · Жалоба Это я "тормоз" или Квартус не умеет передавать параметры в 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. Вполне возможно, что дело в чём-то побочном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 9 сентября, 2008 Опубликовано 9 сентября, 2008 · Жалоба Это я "тормоз" или Квартус не умеет передавать параметры в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться