assign 语句将合成什么?
What will the assign statements get synthesized as?
我很想知道这些线会合成什么?我正在设计一个直接映射缓存并使用分配来分隔我的索引、偏移和标记位。它会合成一个解复用器吗?我没有提及整个代码,因为我只想知道综合后赋值语句的外观。在 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
上面的代码将简单地合成为线的代码,因为只有分配。
我不确定您要创建的解复用逻辑是什么,但通常对于解复用器,您需要有一个 select 信号,根据该信号解码应该启用哪个输出。
下面给出了 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
由于 assign
的 RHS 上没有布尔运算符或算术运算符,这些语句只是成为 address
输入的部分选择的方便命名引用。这与实例化模块并连接到其端口时发生的事情相同——信号可以通过名称更改。事实上,您可以将 address
输入端口声明写为
input .address({tag_in,index,offset}),
实例化该模块时仍然连接address
端口,但在模块内部,它只有tag_in、索引和偏移量可供参考,没有地址。
SystemVerilog 具有 alias
结构,可以更明显地表明您只是为信号创建一个方便的名称,而不是声明另一组信号并使用 assign
语句。
alias offset = address[1:0];
alias index = address[9:2];
alias tag_in = address[15:10];
我很想知道这些线会合成什么?我正在设计一个直接映射缓存并使用分配来分隔我的索引、偏移和标记位。它会合成一个解复用器吗?我没有提及整个代码,因为我只想知道综合后赋值语句的外观。在 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
上面的代码将简单地合成为线的代码,因为只有分配。 我不确定您要创建的解复用逻辑是什么,但通常对于解复用器,您需要有一个 select 信号,根据该信号解码应该启用哪个输出。
下面给出了 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
由于 assign
的 RHS 上没有布尔运算符或算术运算符,这些语句只是成为 address
输入的部分选择的方便命名引用。这与实例化模块并连接到其端口时发生的事情相同——信号可以通过名称更改。事实上,您可以将 address
输入端口声明写为
input .address({tag_in,index,offset}),
实例化该模块时仍然连接address
端口,但在模块内部,它只有tag_in、索引和偏移量可供参考,没有地址。
SystemVerilog 具有 alias
结构,可以更明显地表明您只是为信号创建一个方便的名称,而不是声明另一组信号并使用 assign
语句。
alias offset = address[1:0];
alias index = address[9:2];
alias tag_in = address[15:10];