[SAP]用Check Deposit做customer应收账款clear

本文介绍了一种在ERP系统中手工处理支票存款并完成应收账款清算的方法。具体步骤包括创建发票、支票收款录入及清算确认等。最终通过查看余额和开放项目验证了流程的有效性。

我们手动的做一下支票存款(Check Deposit)来进行应收账款的Clear操作。

首先TCODE FB70来做一张invoice

其中customer为PAUL POWER,Accounts Receivable帐户为159100. 应收账款11欧元。

此刻我们用TCODE   FBL5N - Display/Change Line Items来查看PAUL POWER客户,可以看到这笔未清项。

TCODE FAGLB03 - Display Balances (New) 查看other receivable的balance状况为

 

之后我们便开始手动操作支票收款,TCODE为FF68 - Manual Entry

其中输入check支票的屏幕需要输入支票金额,支票号码,支付的customer的search item以及Invoice号码。

但输入结束,保存之后,通过菜单,进行POST,我们会看到生成了两个session。

因为check deposite会有两个session操作的过程:

subledger session用来与客户AR帐户做clear

bank session会对bank账户做clear

 

通过TCODE SM35会发现两个新建立的session,首先选中BANK session,点击process,选择foreground,我们可以看到整个clear的过程,是通过FB01进行的。

之后选中customer session,点击process,可以看到整个clear过程,通过FB05进行。

Bank session跑完之后,我们再次查看159100的balance,可以看到,已经有11欧元的debit

subledger session跑完之后,我们再次查看paul power的open item已经消失了,出现在了cleared item里面

 

通过FB03可以查看这两个session执行之后产生的document. 整个check deposit过程就结束了。

<think> 我们正在讨论UVM中的寄存器模型后门访问,特别是如何使用`uvm_hdl_deposit`函数进行后门写入操作。 根据引用[1]、[2]和[3]: 引用[1]指出:在寄存器模型的后门访问写操作中,调用`uvm_hdl_deposit`函数。 引用[2]提到:UVM提供了一些DPI方法用于后门访问,其中包括`uvm_hdl_deposit`(在对的.c文件中实现)。 引用[3]比较了前门访问和后门访问,并提到后门访问可以直接通过DPI将值写入RTL寄存器,且零时刻响。 因此,用户要求查找`UVM deposit`的使用示例,实际上就是`uvm_hdl_deposit`的使用示例。 使用步骤大致如下: 1. 在建立寄存器模型时,需要为寄存器或寄存器域设置正确的HDL路径(以便工具能够找到对的硬件信号)。 2. 在需要执行后门写入操作的地方,调用`uvm_hdl_deposit`函数。 函数原型(在UVM中通常通过DPI-C调用): `function int uvm_hdl_deposit(string path, uvm_hdl_data_t value);` 其中: - `path` 是硬件中寄存器的完整路径(字符串)。 - `value` 是要写入的数据(通常为64位整数或双精度浮点数,但实际用中多为整数)。 注意:此函数在UVM的DPI层实现,具体实现依赖于仿真器(VCS, Questa, Incisive等)。 示例场景: 假设我们有一个寄存器在RTL中的路径为:`top.dut.reg1`,我们希望将值32'hdeadbeef写入该寄存器。 在UVM验证环境中,可以直接调用: ```systemverilog int status; status = uvm_hdl_deposit("top.dut.reg1", 32'hdeadbeef); if (status != 1) begin `uvm_error("HDL_DEPOSIT", $sformatf("Failed to deposit to 'top.dut.reg1'")) end ``` 注意: 1. 路径字符串必须正确,且与编译时提供的路径映射一致(通常通过`uvm_config_db`设置或寄存器模型中指定)。 2. 返回值:1表示成功,0表示失败。 另外,在寄存器模型(register model)中,通常不会直接调用`uvm_hdl_deposit`,而是通过寄存器模型的后门访问接口。例如,对寄存器模型中的某个寄存器执行写操作,并设置使用后门访问: ```systemverilog // 假设有已经创建好的寄存器模型reg_model,并且已经映射到物理总线上(包括后门路径设置) uvm_status_e status; reg_model.reg1.write(status, 32'hdeadbeef, UVM_BACKDOOR); ``` 在寄存器模型的底层实现中,当使用`UVM_BACKDOOR`方式时,最终会调用`uvm_hdl_deposit`(或者对于读操作调用`uvm_hdl_read`)。 因此,直接使用`uvm_hdl_deposit`的场景通常是在不需要通过寄存器模型,而直接对硬件信号进行写入的时候。 下面提供一个直接使用`uvm_hdl_deposit`的完整示例,以及通过寄存器模型进行后门访问的示例。 示例1:直接调用`uvm_hdl_deposit` ```systemverilog // 在某个UVM组件(如driver或scoreboard)中 task write_register_directly(string path, bit [31:0] value); int status; status = uvm_hdl_deposit(path, value); if (status != 1) begin `uvm_error("DEPOSIT_ERR", $sformatf("Cannot deposit to %0s", path)) end else begin `uvm_info("DEPOSIT_OK", $sformatf("Deposited 0x%8h to %0s", value, path), UVM_LOW) end endtask ``` 示例2:通过寄存器模型进行后门访问 ```systemverilog // 假设已经创建了寄存器模型m_reg_model,并且配置到测试环境中 task write_register_via_model(uvm_reg target_reg, bit [31:0] value); uvm_status_e status; target_reg.write(status, value, .path(UVM_BACKDOOR)); if (status != UVM_IS_OK) begin `uvm_error("REG_WRITE", $sformatf("Failed to write register %0s via backdoor", target_reg.get_name())) end endtask ``` 注意:使用寄存器模型的后门访问,需要在构建寄存器模型时为每个寄存器设置正确的HDL路径。这通常在寄存器块(uvm_reg_block)的`build`方法中完成。 例如,在寄存器块中定义寄存器并设置路径: ```systemverilog class my_reg_block extends uvm_reg_block; rand my_reg reg1; virtual function void build(); // 创建寄存器 reg1 = my_reg::type_id::create("reg1"); reg1.configure(this, null, "reg1"); // 设置寄存器的HDL路径 reg1.add_hdl_path_slice("reg1", 0, 32); // 假设RTL中寄存器的路径相对于该block的根路径为"reg1" // 设置整个block的HDL路径 this.add_hdl_path("top.dut", "RTL"); // 设置该block的根路径为"top.dut" endfunction endclass ``` 这样,当使用后门访问时,寄存器模型会自动将寄存器的路径拼接为"top.dut.reg1"。 总结: - 直接使用`uvm_hdl_deposit`需要提供完整路径,适合直接操作信号。 - 使用寄存器模型的后门访问更抽象,且与寄存器模型集成,推荐在验证环境中使用。 请根据实际需要选择合适的方法。 相关问题: §§相关问题§§ 1. UVM中前门访问和后门访问的主要区别是什么? 2. 如何为UVM寄存器模型配置HDL路径? 3. 使用`uvm_hdl_deposit`时,如果路径错误或信号不存在,如何处理? 4. UVM寄存器模型中的`uvm_reg`类的`write`方法如何使用后门访问? </think> ### UVM `uvm_hdl_deposit` 使用示例 `uvm_hdl_deposit` 是 UVM 中实现寄存器后门访问的关键 DPI 函数,用于**直接修改 RTL 硬件寄存器的值**(零时刻生效)。以下是完整的使用示例和说明: #### 1. **基础用法示例** ```systemverilog // 在 UVM 组件(如 driver 或 sequence)中调用 task write_register_backdoor(); string hdl_path = "top_tb.dut.control_reg"; // RTL 寄存器完整路径 logic [31:0] value = 32'hCAFE_BABE; // 待写入的值 int status; // 使用 uvm_hdl_deposit 写入 status = uvm_hdl_deposit(hdl_path, value); // 核心调用 // 检查结果 if (status == 0) begin `uvm_error("HDL_ERR", $sformatf("Failed to write %0h to %0s", value, hdl_path)) end else begin `uvm_info("HDL_OK", $sformatf("Deposited 0x%8h to %0s", value, hdl_path), UVM_LOW) end endtask ``` #### 2. **通过寄存器模型调用** 需在寄存器模型中配置 HDL 路径: ```systemverilog // 寄存器模型定义 class ral_reg_CONTROL extends uvm_reg; `uvm_object_utils(ral_reg_CONTROL) function new(string name = "reg_control"); super.new(name, 32, UVM_NO_COVERAGE); endfunction // 定义寄存器域 rand uvm_reg_field data; virtual function void build(); data = uvm_reg_field::type_id::create("data"); data.configure(this, 32, 0, "RW", 0, 32'h0, 1, 1, 1); // 关键:设置后门访问路径! add_hdl_path_slice("control_reg", 0, 32); // RTL 路径片段 endfunction endclass ``` 在测试序列中执行后门写入: ```systemverilog // 在 UVM sequence 中调用 task body(); uvm_status_e st; uvm_reg_data_t val = 32'hDEAD_BEEF; // 通过寄存器模型后门写入 p_sequencer.reg_model.control_reg.write(st, val, .path(UVM_BACKDOOR)); // [^1][^3] if (st != UVM_IS_OK) `uvm_fatal("REG_ERR", "Backdoor write failed") endtask ``` --- ### 📌 关键说明 1. **路径设置要求** - 路径必须是 RTL 中寄存器的**完整层次路径**(如 `top.dut.reg_ctrl`) - 路径需在寄存器模型中通过 `add_hdl_path_slice()` 声明[^1][^3] 2. **使用场景** - **快速配置 DUT**:在复位后直接初始化寄存器,避开总线协议耗时 - **错误注入**:强制写入非法值验证异常处理逻辑 - **动态调试**:运行时修改寄存器值而不影响仿真时序 3. **注意事项** ```systemverilog // 错误示例:路径未关联寄存器模型 uvm_hdl_deposit("unmapped_path", 100); // 返回 status=0 失败 // 正确流程: // 1. 在寄存器模型中配置路径 -> 2. 调用 write(..., UVM_BACKDOOR) ``` --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值