【问题标题】:What will the assign statements get synthesized as?分配语句将被合成为什么?
【发布时间】:2016-10-21 12:54:29
【问题描述】:

我很想知道这些线会合成什么?我正在设计一个直接映射缓存并使用分配来分隔我的索引、偏移和标记位。它会合成到解复用器吗?我没有提到整个代码,因为我只想知道赋值语句在综合之后的样子。在 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

【问题讨论】:

    标签: verilog system-verilog synthesis


    【解决方案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
    

    【讨论】:

    • 所以我的问题是硬件将使用什么逻辑来分离地址信号的不同位?
    • @ShankhadeepMukerji Harware 不需要使用任何逻辑,因为您的代码中没有逻辑。这就像互连两条线。
    • 是否会使用 always_comb 也推断出与 assign 相同的结果?
    • 是的。 always_comb begin D1 = ~sel ? Q : 0; D2 = sel ? Q : 0; end
    【解决方案2】:

    由于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];
    

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多