Почему мы можем использовать Always_ff внутри Always_comb в SystemVerilog? - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь создать триггеры для выполнения операций сдвига, а затем мультиплексирование, чтобы выбрать правильное поведение, которое я хотел. Однако SystemVerilog не позволяет мне переключаться с последовательной логики (триггеры) на комбинационную. У вас есть какие-нибудь рекомендации? Спасибо

/*
    Problem 3: Consider the following design Model_1:
    a) a 8-bit input data_in [7:0]
    b) 8 register outputs data_out [7:0]
    c) Clock(CLK)
    d) a 3-bit operation code OP [2:0].
    The function of the OP code is defined as:
    000: Reset all registers to 0
    001: Arithmetic shift right (shift right and keep the highest bit value)
    010: Arithmetic shift left (shift left and fill the lowest bit with 0)
    011: Shift right (shift right lowest bit wraps to the highest bit)
    100: Shift left (shift left the highest bit wraps to the lowest bit)
    101: Keep current registers’ data
    110: Default (You can define your own logic/arithmetic operations)
    Tasks:
    Write and simulate a synthesizable 8-bit shifter register model in Systemverilog .
    */

module Model_1(output logic [7:0] data_out,input logic [7:0] data_in,input CLK,input logic [2:0] OP);
localparam zero = 0'b0;
always_comb
unique casez(OP)
3'b000: data_out = 8'b00000000;//Reset all registers to 0
3'b001: //Arithmetic shift right (shift right and keep the highest bit value)
        always_ff @(posedge CLK) data_out <= {data_in[7], data_in[7:1]}; ;
3'b010:  //Arithmetic shift left (shift left and fill the lowest bit with 0)
        always_ff @(posedge CLK) data_out <= {data_in[6:0], zero}; ;
3'b011: //Shift right (shift right lowest bit wraps to the highest bit)
        always_ff @(posedge CLK) data_out <= {data_in[0], data_in[7:1]}; ;
3'b100: //Shift left (shift left the highest bit wraps to the lowest bit)
        always_ff @(posedge CLK) data_out <= {data_in[6:0], data_in[7]}; ;
3'b101: data_out = data_in;//Keep current registers’ data
default: data_out = 8'b????????;
endcase
endmodule

1 Ответ

0 голосов
/ 10 ноября 2019

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

Модуль verilog состоит из операторов assign, процедурных блоков (always,initial, final) и instances других модулей (или других элементов дизайна).

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

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

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

always_ff @(posedge clk) begin
    unique casez(OP)
    3'b000: 
        data_out <= 8'b00000000;
    3'b001: 
        data_out <= {data_in[7], data_in[7:1]}; ;
    3'b010:  
        data_out <= {data_in[6:0], zero}; ;
    ...
    endcase
end 

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

...