реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Не получается синтезировать мультиплексор шин, Verilog
misyachniy
сообщение Sep 15 2017, 08:41
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 691
Регистрация: 27-05-05
Из: Kiev
Пользователь №: 5 454



Понадобилось создать мультиплексор шин 4 в 1.
Тут взял пример:
http://www.dsol.ru/stud/STESHENKO/glava3/34.htm
Цитата
module multiplexor4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2);
output out;
input in1, in2, in3, in4, cntrl1, cntrl2;

assign out = cntrl1 ? (cntrl2 ? in4 : in3) : (cntrl2 ? in2 : in1);

endmodule


Gо примеру написал свой:
Цитата
input [7:0] external_porog,
input [DATA_WIDTH-1:0] porog_simple,
input [DATA_WIDTH-1:0] porog_range,
output [DATA_WIDTH-1:0] selected_porog,

// мультиплексор порога
always @(mode_simple or mode_manual or mode_range)
begin
assign selected_porog = mode_simple ? porog_simple : mode_manual ? {1'b0,external_porog,1'b0}: mode_range?porog_range:{DATA_WIDTH{1'b1}};
end


Получил ошибку при симуляции ModelSim
# ** Error: delay_17_string.v(104): LHS in procedural continuous assignment may not be a net: selected_porog.

И при синтезе
ERROR:HDLCompiler:1660 - "E:\Halt\maisb_s6\hdl\low_level\threshold\delay_17_string.v" Line 104: Procedural assignment to a non-register selected_porog is not permitted, left-hand side should be reg/integer/time/genvar

Никаких препятствий синтезировать мультиплексор без регистров не вижу :-(
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Sep 15 2017, 09:02
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 934
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

Поработаю капитаном ...

Если хотите assign то зачем оборачиваете это в always ? cranky.gif

Удачи! Rob.
Go to the top of the page
 
+Quote Post
misyachniy
сообщение Sep 15 2017, 09:42
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 691
Регистрация: 27-05-05
Из: Kiev
Пользователь №: 5 454



Цитата(RobFPGA @ Sep 15 2017, 12:02) *
Приветствую!

Поработаю капитаном ...

Если хотите assign то зачем оборачиваете это в always ? cranky.gif

Удачи! Rob.


Без always работает.
6 лет пишу в основнов синхронные проекты, совсем азбуку забыл ;-)
Go to the top of the page
 
+Quote Post
des333
сообщение Sep 15 2017, 11:43
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 111
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(misyachniy @ Sep 15 2017, 12:42) *
Без always работает.
6 лет пишу в основнов синхронные проекты, совсем азбуку забыл ;-)


При использовании assign проект не становится асинхронным.


--------------------
Go to the top of the page
 
+Quote Post
nice_vladi
сообщение Sep 16 2017, 03:35
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 7-09-16
Из: Томск
Пользователь №: 93 239



Цитата(misyachniy @ Sep 15 2017, 08:41) *
Понадобилось создать мультиплексор шин 4 в 1.
Тут взял пример:
http://www.dsol.ru/stud/STESHENKO/glava3/34.htm


Gо примеру написал свой:


Получил ошибку при симуляции ModelSim
# ** Error: delay_17_string.v(104): LHS in procedural continuous assignment may not be a net: selected_porog.

И при синтезе
ERROR:HDLCompiler:1660 - "E:\Halt\maisb_s6\hdl\low_level\threshold\delay_17_string.v" Line 104: Procedural assignment to a non-register selected_porog is not permitted, left-hand side should be reg/integer/time/genvar

Никаких препятствий синтезировать мультиплексор без регистров не вижу :-(


День добрый! Сверху все верно написали) Либо assign, либо always - одно с другим не смешивается.

Хотелось вставить пять копеек по поводу написания. Вообще не понимаю такие "однострочные" конструкции. Конечно, дело привычки, но

Код
assign selected_porog = mode_simple ? porog_simple : mode_manual ? {1'b0,external_porog,1'b0}: mode_range?porog_range:{DATA_WIDTH{1'b1}};


строка такого вида заставляет капать кровь из глаз...

Я бы сделал подобным образом:

Код
always_comb begin
  if (mode_simple)           selected_porog = porog_simple;
  else if (mode_manual)      selected_porog = {1'b0,external_porog,1'b0};
     else if (mode_range)    selected_porog = porog_range;
        else                 selected_porog = '1;
end


Ну или как-то разложил на несколько строк вашу строку. Или добавил бы кучу скобочек, как минимум cool.gif
Go to the top of the page
 
+Quote Post
Mad_max
сообщение Sep 16 2017, 08:26
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 23-12-06
Из: Зеленоград
Пользователь №: 23 811



Цитата(nice_vladi @ Sep 16 2017, 06:35) *
Код
always_comb begin
  if (mode_simple)           selected_porog = porog_simple;
  else if (mode_manual)      selected_porog = {1'b0,external_porog,1'b0};
     else if (mode_range)    selected_porog = porog_range;
        else                 selected_porog = '1;
end

Позанудствую немного.
В ряде стандартов и рекомендаций говориться, что для описания комбинаторики не стоит использовать if else конструкцию,
либо case, либо через ?. Аргумент такой, что можно получить различный результат моделирования RTL описания и netlist.
Сам, ей Богу, ни разу с таким не сталкивался, но не просто также это рекомендуют...
Go to the top of the page
 
+Quote Post
cdg
сообщение Sep 17 2017, 15:35
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 309
Регистрация: 8-09-04
Из: Таганрог
Пользователь №: 617



Цитата(Mad_max @ Sep 16 2017, 12:26) *
но не просто также это рекомендуют...

рекомендация связана с опасностью генерации latch при некорректном описании сложной структуры в if, т.к. очень просто "потерять" где-то деблокирующий else.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 18 2017, 02:45
Сообщение #8


Adept
******

Группа: Свой
Сообщений: 3 373
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (cdg @ Sep 17 2017, 22:35) *
рекомендация связана с опасностью генерации latch при некорректном описании сложной структуры в if, т.к. очень просто "потерять" где-то деблокирующий else.

Да. И это легко обходится путём присвоения значения по умолчанию до if. Поэтому, имхо, if...else или case ... - скорее дело вкуса и удобочитаемости.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 18 2017, 06:51
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



Напомню что конструкцию case можно синтезнуть как full parallel и тогда это уже становиться не делом вкуса. Ровно также можно не написать дефолт в кейзе и прийти к тому же лачу.
Просто вопрос читаемости...
Go to the top of the page
 
+Quote Post
cdg
сообщение Sep 18 2017, 09:23
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 309
Регистрация: 8-09-04
Из: Таганрог
Пользователь №: 617



Цитата(dxp @ Sep 18 2017, 05:45) *
Да. И это легко обходится путём присвоения значения по умолчанию до if. Поэтому, имхо, if...else или case ... - скорее дело вкуса и удобочитаемости.

В формате языка Verilog 1364_2001 тоже? wink.gif

Цитата(Golikov A. @ Sep 18 2017, 09:51) *
Ровно также можно не написать дефолт в кейзе и прийти к тому же лачу.

Был вопрос с чем связаны рекомендации, ответ для стандартов языка 1995 && 2001 очевиден.
Go to the top of the page
 
+Quote Post
Mad_max
сообщение Sep 18 2017, 12:38
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 23-12-06
Из: Зеленоград
Пользователь №: 23 811



Вот пример, где неправильное использование if else может добавить
головной боли не только по причине синтезирования latch'ей.

Имеем кода №1.
Код
module test (
    input  wire i1,
    input  wire i2,
    output reg  o1,
    output wire o2);

always @ (i1 or i2)
  case ({i1, i2})
    2'b10:       o1 = 1'b0;
    2'b11:       o1 = 1'b1;
    default:     o1 = 1'b0;
  endcase

assign o2 = (i2 || o1) ? 1'b0 : i2;

endmodule

Имеем кода №2.
Код
module test (
    input  wire i1,
    input  wire i2,
    output reg  o1,
    output reg o2);

always @ (i1 or i2)
  case ({i1, i2})
    2'b10:       o1 = 1'b0;
    2'b11:       o1 = 1'b1;
    default:     o1 = 1'b0;
  endcase

always @ (i2 or o1)
   if (o1) o2 = 1'b0;
   else    o2 = i2;

endmodule

Ну и тест к нему простой
Код
module tb_top;

    reg i1,i2;
    wire o1,o2;

    //-----------------------------------------------------------------------------------
    // DUT
    //-----------------------------------------------------------------------------------
  
    test
    u_test (
                    .i1    ( i1 ),
                    .i2    ( i2 ),
                    .o1    ( o1 ),
                    .o2    ( o2 )
                );

    //-----------------------------------------------------------------------------------
    // Run test
    //-----------------------------------------------------------------------------------
  
    initial begin
        #10ns;
        i1 = 0;
        i2 = 0;
        #10ns;
        i1 = 0;
        i2 = 1;
        #10ns;
        i1 = 1;
        i2 = 0;
        #10ns;
        i1 = 1;
        i2 = 1;
        #10ns;
    end

endmodule


Если промоделировать два варианта, а потом сравнить с результатом моделирования netlist (он в обоих случаях одинаковый).
Мы увидим, что для кода №2 результат моделирования RTL и netlist отличается, при i1 = 0; i2 = 1; выход о2 ошибочно в лог.1.

Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 18 2017, 13:23
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Был вопрос с чем связаны рекомендации, ответ для стандартов языка 1995 && 2001 очевиден.

Не понял что в контексте обсуждения с этими стандартами не так?


Цитата
Вот пример, где неправильное использование if else может добавить
головной боли не только по причине синтезирования latch'ей.


не ну это не честно: в первом случае if(i2 || o1), а во втором if(o1).
тут больше проблем из-за ошибки в списке чувствительности может быть, но и это обходиться через always @(*)


Еще есть может быть разница в обработке Z, X состояний, кейз вроде как на моделирвоании идет до первого подходящего случая, но в этом я не уверен.
Go to the top of the page
 
+Quote Post
Mad_max
сообщение Sep 18 2017, 13:33
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 23-12-06
Из: Зеленоград
Пользователь №: 23 811



Цитата(Golikov A. @ Sep 18 2017, 16:23) *
не ну это не честно: в первом случае if(i2 || o1), а во втором if(o1).
тут больше проблем из-за ошибки в списке чувствительности может быть, но и это обходиться через always @(*)

Что интересно, обе схемы синтезировались то корректно, проблема возникает только при моделировании.
Ну и типа не пишите через if else, а через ? или case, во всяких умных рекомендациях вещают.
Цитата(Golikov A. @ Sep 18 2017, 16:23) *
Еще есть может быть разница в обработке Z, X состояний, кейз вроде как на моделирвоании идет до первого подходящего случая, но в этом я не уверен.

Да да все эти гадские X'и.
Go to the top of the page
 
+Quote Post
des333
сообщение Sep 18 2017, 13:35
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 111
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(Mad_max @ Sep 18 2017, 15:38) *
Если промоделировать два варианта, а потом сравнить с результатом моделирования netlist (он в обоих случаях одинаковый).


На сколько Вы в этом уверены?

Цитата(Mad_max @ Sep 18 2017, 16:33) *
Что интересно, обе схемы синтезировались то корректно, проблема возникает только при моделировании.


То есть у Вас оба варианта при синтезе дают одинаковый результат?
А чем синтезируете?


--------------------
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 18 2017, 13:40
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



мне тоже кажется что схемы разные. Просто мы видим разные условия формирования выхода о2, по таблице истинности они различны, как может быть одна схема?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th December 2017 - 12:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.02132 секунд с 7
ELECTRONIX ©2004-2016