assign语句将被合成为什么?

时间:2016-10-21 12:54:29

标签: verilog system-verilog synthesis

我很想知道这些线路会合成什么?我正在设计一个直接映射的缓存,并使用assign来分隔我的索引,偏移和标记位。它会合成一个多路分解器吗?我没有提到整个代码,因为我只想知道在复合后assign语句的样子。在8085编程中,我把这个术语称为“地址解复用”,因此令人困惑。

module cache 
        (   input bit clk,
            input bit rst,
            input logic [15:0] address,
            input logic valid_in,
            input logic compare,
            input logic wr,
            input logic enable,
            input logic write_through,
            output logic dirty,
            output logic [4:0] tag_out,
            output logic [15:0] data_out,
            output logic valid_out,
            output hit
        );

            logic [7:0] index;
            logic [1:0] offset;
            logic [4:0] tag_in;

            assign offset = address[1:0];
            assign index  = address[9:2];
            assign tag_in = address[15:10];

    endmodule

2 个答案:

答案 0 :(得分:1)

以上代码只是简单地合成为线路,因为只有分配。 我不确定您要创建的解复用逻辑是什么,但通常对于解复用器,您需要有一个选择信号,根据该信号解码应该启用哪个输出。

下面给出了1:2解复用器逻辑的示例

module demux_1_2(
   input [3:0] Q, 
   input Sel,
   output reg [3:0] D1, 
   output reg [3:0] D2
   );

always@(*) 
begin
   if(~Sel) begin 
      D1 = Q;
      D2 = 0; 
   end else begin 
      D1 = 0; 
      D2 = Q; 
   end
end

endmodule

答案 1 :(得分:0)

由于assign的RHS上没有布尔运算符或算术运算符,因此这些语句只是方便地命名为address输入的部分选择的引用。这与实例化模块并连接到其端口时发生的情况相同 - 信号可以通过名称更改。实际上,您可以将address输入端口声明写为

input .address({tag_in,index,offset}),

在实例化此模块时仍然连接address端口,但在模块内部,它只有tag_in,index和offset可供引用,而不是地址。

SystemVerilog具有alias结构,可以更明显地为信号创建方便的名称,而不是声明另一组信号并使用assign语句。

 alias offset = address[1:0];
 alias index  = address[9:2];
 alias tag_in = address[15:10];