关于always_ff与always_comb逻辑门映射差异的技术问询
关于always_comb与always_ff的逻辑生成机制疑问
我搞不懂always_ff在生成逻辑门网络时的工作机制。拿always_comb来说,我理解它是从上到下分析代码,最终生成对应输入输出的逻辑门组合,后续赋值会覆盖初始赋值;但老师说always_comb是“阻塞”的,always_ff则不是,我完全搞不懂这是什么意思——难道always_ff不会生成输入到输出的最终逻辑门结果吗?
参考的always_comb代码实例
实例1:格雷码编解码模块
module gray_koder_dekoder(i_data, i_oper, o_code); parameter LEN = 4; input logic [LEN-1:0] i_data; input logic i_oper; output logic [LEN-1:0] o_code; int i; always_comb begin o_code = '0; i = LEN-1; if (i_oper == 1'b1) // 1'b1 - 编码操作 begin o_code = i_data ^ (i_data >> 1); end else // 其他值则执行解码 begin o_code = i_data; for (i=LEN-1; i>0; i=i-1) begin o_code[i-1] = o_code[i] ^ i_data[i-1]; end end end endmodule
实例2:格雷码解码模块
module gray_dekoder (i_gray, o_data); parameter LEN = 4; input logic [LEN-1:0] i_gray; output logic [LEN-1:0] o_data; always_comb begin o_data = i_gray; for (int i=LEN-1; i>0; i=i-1) o_data[i-1] = o_data[i] ^ i_gray[i-1]; end endmodule
实例3:位替换模块
module replace(i_a, i_b, o_replaced, o_error); parameter BITS = 4; input logic signed [BITS-1:0] i_a, i_b; output logic signed [BITS-1:0] o_replaced; output logic o_error; int i; always_comb begin o_replaced = '0; if(i_b < 0 || i_b > BITS) begin o_error = 1; o_replaced = 'x; end else begin i = i_b; o_replaced = i_a; o_replaced[i-1] = 1; o_error = 0; end end endmodule
具体疑惑点
- 我对
always_comb的覆盖逻辑仍有疑惑:比如第三个实例中,初始赋值o_replaced = '0在else分支里的执行流程中,是否真的未被覆盖?后续的赋值操作是如何覆盖初始值的? - 想明确
always_ff的执行逻辑与逻辑门生成方式:它和always_comb的核心区别是什么?老师所说的“阻塞”和“非阻塞”具体指什么?它最终是否也会生成对应输入输出的逻辑门网络?
内容的提问来源于stack exchange,提问作者user331990
相关产品推荐
相关产品推荐

