Назначение регистра Verilog части другого регистра

Я использую Verilog с modelSim и получаю следующие ошибки, когда пытаюсь присвоить reg-переменные разным частям другой reg-переменной:

** Error: Range width must be greater than zero.
** Error: Range width must be constant expression.

вот соответствующий код:

 integer f; //zd, qd, R and Q are regs

    always @ * begin 
    f = 52 - zd; 
    R = qd[f +:0]; 
    Q = qd[63 -:f+1]; 
    end

Я хочу, чтобы R включал qd (от 0 до f), а Q был (остальные) qd (от f+1 до 63). Как это сделать? Спасибо.


person mj1261829    schedule 06.04.2012    source источник
comment
Вот ответ на аналогичную проблему.   -  person    schedule 09.04.2012


Ответы (1)


То, что вы пытаетесь сделать, недопустимо в Verilog 2001.

Как говорится в вашем предупреждении, Range width must be constant expression, т.е. у вас не может быть выбора частей переменной длины.

У вас может быть выбор части фиксированной длины, который изменяет начальную точку (т.е. выбирает 8 бит, начиная с f), но синтаксис для этого таков:

vector_name[starting_bit_number +: part_select_width]
vector_name[starting_bit_number -: part_select_width]

В аппаратном обеспечении размер шины должен быть фиксированным, вы не можете изменить количество проводов в кремнии на основе содержимого регистра :)

person Tim    schedule 06.04.2012
comment
Это верно, но не достигает того, чего я действительно хотел. Что, если часть select_width больше, чем остальные биты? все остальные биты будут выбраны без проблем? - person mj1261829; 07.04.2012
comment
@user1261829 user1261829: Вероятно, будут просто сгенерированы неверные данные, если вы выберете начальный бит таким, чтобы выбор части переполнил шину. Можете ли вы описать, что вы пытаетесь сделать на более высоком концептуальном уровне? Может быть, есть лучший способ сделать это, чем то, что вы пытаетесь сделать. - person Tim; 07.04.2012
comment
На самом деле, qd — это результат умножения двух чисел с фиксированной точкой после их преобразования из числа с плавающей запятой, и я хочу, чтобы результат был разбит на целые биты и дробные биты. - person mj1261829; 07.04.2012