You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog中子模块输出作为新子模块输入无数据输出问题求助

问题排查与修正方案

看起来你在Verilog模块互联和时序逻辑设计上踩了几个典型的坑,咱们一步步拆解问题,然后给出修正后的代码:

核心问题分析

  1. 位宽严重不匹配
    你明确提到生成的是228位的Secret_Key,但你的代码里不管是顶层模块还是Combine_bit子模块,都把Secret_Key、Plaintext_data、Ciphertext定义成了单bit信号。这就好比你把一根228芯的电缆插进了1孔的插座,数据根本没法正常传输,仿真自然看不到有效输出。

  2. 时序逻辑设计完全错误
    Combine_bit模块的always块只在Reset上升沿触发时赋值,正常时钟沿(posedge Clk)下完全没有处理逻辑。而且复位信号的作用通常是把输出清零,不是在复位阶段去计算异或,这完全搞反了时序逻辑的设计原则。

  3. 信号重复声明
    在顶层模块和Combine_bit模块里,你都同时把Plaintext_data声明为input又wire,这属于冗余且不符合Verilog语法规范的写法,会导致编译警告甚至逻辑错误。

  4. 缺少密钥有效性的同步判断
    Encryp_System生成密钥需要一定的时钟周期,Combine_bit应该等密钥生成完成后再开始运算,否则拿到的可能是模块初始化的无效值。


修正后的代码

顶层模块(修正位宽与冗余声明)

// -------top module-------
module Communication_security(
    // 声明所有IO端口
    input Clk, 
    input Reset, 
    input Start, 
    input [227:0] Plaintext_data,  // 与Secret_Key保持228位位宽匹配
    output [227:0] Secret_Key, 
    output [227:0] Ciphertext
);

// 实例化密钥生成子模块
Encryp_System Es(
    .Start(Start),
    .Clk(Clk),
    .Reset(Reset),
    .Secret_Key(Secret_Key)  // 你确认该模块已正常生成228位密钥,这里直接互联即可
);

// 实例化异或运算子模块
Combine_bit Cb(
    .Start(Start),
    .Clk(Clk),
    .Reset(Reset),
    .Secret_Key(Secret_Key),
    .Plaintext_data(Plaintext_data),
    .Ciphertext(Ciphertext)
);

endmodule

异或运算子模块(修正时序逻辑与位宽)

// ----sub module to combine the bits (secret_key ^ Plaintext_data)------
module Combine_bit(
    input Clk, 
    input Reset, 
    input [227:0] Secret_Key,  // 228位位宽
    input [227:0] Plaintext_data,  // 228位位宽
    input Start,
    output reg [227:0] Ciphertext  // 228位位宽
);

// 时序逻辑:复位清零,Start有效时执行异或运算
always @ (posedge Clk or posedge Reset) begin
    if (Reset) begin
        Ciphertext <= 228'd0;  // 复位时输出清零,符合常规设计
    end else if (Start) begin  // 当Start信号有效时,执行异或运算
        Ciphertext <= Secret_Key ^ Plaintext_data;
    end
    // 如果需要持续输出异或结果(比如Plaintext_data实时变化),可以去掉else if(Start),直接在每个时钟沿计算
end

endmodule

额外建议

  • 先单独仿真Combine_bit模块:给它输入固定的228位测试密钥和明文,验证异或逻辑是否正常,再联调顶层模块,这样更容易定位问题。
  • 如果你的Plaintext_data是串行输入(1位/周期),那需要修改为串行处理逻辑:比如用移位寄存器把明文缓存成228位,再和密钥异或,具体逻辑可以根据你的数据流调整。

内容的提问来源于stack exchange,提问作者Muhammad Afnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:13:26